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
一 堆中存放具体数据 栈中存放你所命名的变量名字
二 既然叫匿名函数 自然没有名字 所以这就是在堆里有具体数据 而栈中没有名字指向这个数据的意思
相似回答