C语言局部变量是何时分配和回收空间的?如图中所有的变量他们的分配和销毁都是在什么时候呢?

如题所述

前面所以回答都不全面。
1、局部变量所占用的内存空间的分配和销毁,取决于编译器的实现,编译器在为了优化程序性能,可能有不同的策略来分配、释放内存。比如:VC编译器可能在函数入口处即分配这里的全部变量,GCC编译器也可能真的在定义处才分配。
2、你该探究的应该是这些局部变量的生命期。这个b\c\d\e 的生命期都是开始于定义变量的地方,终止于语句块结束的地方(对应的反花括弧处结束)
3、这是 C++ 的代码,C 的代码必须在函数开始处定义所有局部变量,以便于编译器为所有局部变量准备栈空间。所以有你这个困惑(局部变量在函数入口时就全部入栈,这个说法是错的么?)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-02-24
如上图, a在整个question()中都存在
b和c[12]在if判定为真的{}语句块中分配,离开if语句块就销毁
d和e[10]在else语句中分配,离开 else{}就销毁

不过上面的程序有问题
if(a='A')里面是个赋值语句,永远为真,所以else永远得不到执行追问

感谢回答,但是我记得以前有看过资料说局部变量在函数入口时就全部入栈,这个说法是错的么?还有数组也是运行时分配空间的么?如果是的话为什么不能动态分配?谢谢~~~

第2个回答  2011-02-25
楼上有误,C按不同的标准 定义变量的方式有不同,有些标准支持在语句中间定义变量
而另一些C标准也不是说必须在函数开始定义变量,其实只要是在一个语句体的开始定义就可以!
楼主,你只需要关心变量生命期的问题就行了,压栈出栈在不同的编译器上有不同的顺序
第3个回答  2011-02-24
你的程序有错误,if(a='A')这个赋值语句,因为赋值后a='A'不为0故系统默认为真,此处你的if()语句没用;还有你声明函数为整型的,要返回一个整型的值,你学的东西里面都没有返回值。当question函数被调用时,系统会为它分配一块儿内存,一开始时,把实参复制给形参 a。然后分配空间给b并给他写入一个整型的0;为c开辟了12个字节的空间。调用结束完这个函数后,会自动回收分配的空间。
第4个回答  2011-02-24
感谢回答,但是我记得以前有看过资料说局部变量在函数入口时就全部入栈,这个说法是错的么?还有数组也是运行时分配空间的么?如果是的话为什么不能动态分配?谢谢~~~

====================
函数入口时全部入栈是对的。
数组是运行时临时分配空间的。但是你指定大小了。就不能动态分配了。
如果要动态分配,得重新开辟内存空间,然后拷贝或者移动数组的内容。这个是要手动完成的。
C语言的强大之处之一就是内存管理的权限比较大。
相似回答