C语言,什么时候需要开辟空间

大一上学期,打的一些练习程序很多都没有开辟空间,弄得我不明白,空间究竟要及时才开辟?求助各位大神

其实写一个函数,开头的声明变量或数组就是在开辟空间,所以只要写代码,开辟空间的事肯定就少不了。但你这里说的我想应该是指“动态开辟空间”。动态开辟空间一般在以下情况下进行:

    编程时不知道需要多大的空间,要在程序运行时由用户输入大小或计算出所需大小;

    一些数据量太大,栈区放不下,需要创建在堆里;

    由于某需要要求代码这样写。

大致就这些情况。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-02-12
对于想要学好C的程序员来说,了解程序运行的存储空间布局是非常有必要的。

C运行的存储空间布局有很多种,不同的操作系统可能存在一些细节的差异,这里只介绍概念,比较细节的部分你有时间可以自己查阅资料。

代码段:由编译生成的机器码组成

只读数据段:存储代码中不被修改的数据,比如代码中定义的一些常量

可读写数据段(已分配初始值):一般用来保存代码中的全局/静态变量,由于赋予了初始值,所以需要记录其初始值

可读写数据段(未分配初始值):一般用来保存代码中的全局/静态变量,由于没有记录初始值,则无需记录,由系统统一赋值(不同系统有差异,一般变量统一是 0,而指针为NULL)

堆(heap):代码运行过程中由malloc 出来的空间,特点是需要程序通过malloc等执行分配除任意长度的内存空间,也必须使用free等指令释放空间,否则会出现内存泄露
·优点:由于内存的分配是根据具体的需求来定义的,不再使用时再手动释放,所以,内存使用率可以自由控制,避免了内存的浪费
·缺点:分配和释放本身是需要耗系统资源的,而且需要程序员清除的知道释放的时间点,增加了编程的难度,也可能因为忘记释放内存导致内存泄露。

栈(stack):典型的使用是函数调用过程中产生的变量,比如在函数中定义一个变量、数组都是从栈中由系统自动分配的空间,退出函数时由系统自动释放
·优点:系统自动分配、释放,操作方便、分配/释放内存效率高,不存在内存泄露
·缺点:需要为每个线程分配一块固定大小的内存区域,内存使用效率低,因为你并不知道运行时需要多大内存,所以必须分配足够大的内存空间、避免内存溢出。

数组、变量、数据结构即可以在堆(heap)中分配,也可以在栈(stack)中分配,一般在栈中分配就能满足需求就尽量使用栈,而有的内存空间就必须使用堆来分配才能满足需求,具体情况具体分析。
第2个回答  2014-02-12
你应该是指malloc的练习吧,这确实是很容易困扰初学者的问题。
前面几位讲得很全面,但可能不够直观。我给你举例说明一下。
以你在编写程序时并不知道你需要多大的空间而需要用到malloc的这种情况为例
比如说:
你知道自己需要用固定需要用1000字节时,你可以使用char a[1000]这样的数组来存放着1000字节,但是如果你事先不知道自己需要多大的内存,如编写 一个程序从硬盘中读取N个字节,其中N由用户自己输入,此时你就需要使用malloc来在内存中分配N个字节来存储硬盘中读出来的N个字节了。
第3个回答  2014-02-12
一般是数据保存有随机、临时、不等长这些情况下需要:

-当需要根据程序即时运行结果开设相应尺寸数组时。比如打开图像文件读取图像尺寸后再开辟空间保存图像。
-临时使用数组,但又不想占用栈空间时。这样操作比用栈空间申请(函数中开数组)访问快、避免栈溢出、灵活,可适用大量零碎的、临时的不等长数组开设及使用。
-类中需要比较大的动态内存保留数据时。有些类的设计中根据状态不同数据区是灵活改变的,这样避免内存浪费,比如CString类,在没有保存字符串数据时,其字符串占用空间为0,而保存字符串后,占用空间根据具体字符串长度随时可调整。
第4个回答  2021-05-27
一 堆中存放具体数据 栈中存放你所命名的变量名字
二 既然叫匿名函数 自然没有名字 所以这就是在堆里有具体数据 而栈中没有名字指向这个数据的意思

C语言,什么时候需要开辟空间
其实写一个函数,开头的声明变量或数组就是在开辟空间,所以只要写代码,开辟空间的事肯定就少不了。但你这里说的我想应该是指“动态开辟空间”。动态开辟空间一般在以下情况下进行:编程时不知道需要多大的空间,要在程序运行时由用户输入大小或计算出所需大小;一些数据量太大,栈区放不下,需要创建在...

c语言什么时候向系统要内存空间?怎么表示?
1、程序即将开始,预编译阶段,发现有全局或静态变量的时候。2、进入函数,并且定义一个局部变量的时候。3、程序员动态申请内存的时候。4、容器类型自增长的时候。大概就这几个情况。需要程序员关心的只有自己动态申请内存,需要手动释放

C语言中“指针变量”为什么要分配内存空间?而有的时候为什么又不用...
如果将指针变量指向一个已开辟过的,即已有的空间,就不需要重新开辟内存空间了,只有需要开辟的时候才开辟内存空间

c语言问题,为什么链表操作过程中对于结构体指针,都要用malloc来开辟内存...
定义的结构体指针只是说明这个指针是指向这个结构的,但并未给它分配内存空间,这就类似于声明,只是告诉系统我这个指针是干什么用的。链表是由一个个的结点链接起来的,而每个结点都是需要内存空间来存储数据的,所以你每新建一个结点,都需要开辟一个空间来存储数据。希望对你有用~...

C语言定义常量和变量的时候到底什么时候分配空间
您好,很高兴回答您的问题!解答:1,字面常量在可执行文件的.data段,随着可执行文件直接加载进内存;2,auto变量一般是在进入定义域的时候在栈上增长出来空间;3,static和全局变量在静态存贮区,程序开始的时候就分配。

C语言问题:在什么情况下需要我们手动申请内存?
当然你申请一个很大的数组也可以解决这个问题,不过还浪费大量的内存空间。使用动态申请可以比较灵活的使用分配内存空间,但是不要忘记释放。我个人感觉动态内存在实际应用程序中较常见(因为此时内存使用可以控制的相对合理),但是在搞算法时就很少用动态了(比如ACM竞赛)。

c语言中malloc函数的用法
在程序运行过程中,如果不再需要某个已经申请过的动态内存空间,则应该将其释放以便其他程序使用。释放内存空间可以使用free函数。由于动态分配内存在运行时才进行,因此可能会出现分配内存失败的情况。为了避免程序在使用未成功分配的内存空间时出现错误,应该在使用malloc函数后检查是否成功分配了内存空间。

C语言里,哪些变量是存放在堆里,哪些是存放在栈里?
放在堆里的数据是管理员自己开辟空间和释放空间,如,new 和malloc。而放在栈里的数据时计算机自动分配内存和释放的,如变量。在c\/c++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局\/静态存储区和常量存储区。1,栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区...

C语言调用函数时会为函数分配自己的函数空间吗?
C语言每一次函数调用,编译器都会为这个函数调用分配一段空间,这段空间用来存放该函数中的所有局部变量和调用其它函数时需要传递的参数的副本。每一次调用这个函数,这段空间都会重新分配,函数返回后这段空间就被释放了,所以重复调用多少次都不会影响的。所有的这些函数调用时候分配的内存都是在线程的栈上...

看C语言的书中说“释放存储空间”,是什么意思?什么叫做释放,为什么叫...
就是通知操作系统,先前申请的指定部分的变量所使用的空间不再使用,使用权交还给操作系统,以便分配给其它程序使用。dispose(p)就是将变量p所代表的空间还给操作系统的意思(原本是向操作系统申请由本程序使用的,操作系统不会再分给别的程序使用)。

相似回答