C语言局部变量是何时分配和回收空间的?如图中所有的变量他们的分配和销毁都是在什么时候呢?
5个回答
展开全部
前面所以回答都不全面。
1、局部变量所占用的内存空间的分配和销毁,取决于编译器的实现,编译器在为了优化程序性能,可能有不同的策略来分配、释放内存。比如:VC编译器可能在函数入口处即分配这里的全部变量,GCC编译器也可能真的在定义处才分配。
2、你该探究的应该是这些局部变量的生命期。这个b\c\d\e 的生命期都是开始于定义变量的地方,终止于语句块结束的地方(对应的反花括弧处结束)
3、这是 C++ 的代码,C 的代码必须在函数开始处定义所有局部变量,以便于编译器为所有局部变量准备栈空间。所以有你这个困惑(局部变量在函数入口时就全部入栈,这个说法是错的么?)
1、局部变量所占用的内存空间的分配和销毁,取决于编译器的实现,编译器在为了优化程序性能,可能有不同的策略来分配、释放内存。比如:VC编译器可能在函数入口处即分配这里的全部变量,GCC编译器也可能真的在定义处才分配。
2、你该探究的应该是这些局部变量的生命期。这个b\c\d\e 的生命期都是开始于定义变量的地方,终止于语句块结束的地方(对应的反花括弧处结束)
3、这是 C++ 的代码,C 的代码必须在函数开始处定义所有局部变量,以便于编译器为所有局部变量准备栈空间。所以有你这个困惑(局部变量在函数入口时就全部入栈,这个说法是错的么?)
展开全部
如上图, a在整个question()中都存在
b和c[12]在if判定为真的{}语句块中分配,离开if语句块就销毁
d和e[10]在else语句中分配,离开 else{}就销毁
不过上面的程序有问题
if(a='A')里面是个赋值语句,永远为真,所以else永远得不到执行
b和c[12]在if判定为真的{}语句块中分配,离开if语句块就销毁
d和e[10]在else语句中分配,离开 else{}就销毁
不过上面的程序有问题
if(a='A')里面是个赋值语句,永远为真,所以else永远得不到执行
追问
感谢回答,但是我记得以前有看过资料说局部变量在函数入口时就全部入栈,这个说法是错的么?还有数组也是运行时分配空间的么?如果是的话为什么不能动态分配?谢谢~~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
楼上有误,C按不同的标准 定义变量的方式有不同,有些标准支持在语句中间定义变量
而另一些C标准也不是说必须在函数开始定义变量,其实只要是在一个语句体的开始定义就可以!
楼主,你只需要关心变量生命期的问题就行了,压栈出栈在不同的编译器上有不同的顺序
而另一些C标准也不是说必须在函数开始定义变量,其实只要是在一个语句体的开始定义就可以!
楼主,你只需要关心变量生命期的问题就行了,压栈出栈在不同的编译器上有不同的顺序
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的程序有错误,if(a='A')这个赋值语句,因为赋值后a='A'不为0故系统默认为真,此处你的if()语句没用;还有你声明函数为整型的,要返回一个整型的值,你学的东西里面都没有返回值。当question函数被调用时,系统会为它分配一块儿内存,一开始时,把实参复制给形参 a。然后分配空间给b并给他写入一个整型的0;为c开辟了12个字节的空间。调用结束完这个函数后,会自动回收分配的空间。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
感谢回答,但是我记得以前有看过资料说局部变量在函数入口时就全部入栈,这个说法是错的么?还有数组也是运行时分配空间的么?如果是的话为什么不能动态分配?谢谢~~~
====================
函数入口时全部入栈是对的。
数组是运行时临时分配空间的。但是你指定大小了。就不能动态分配了。
如果要动态分配,得重新开辟内存空间,然后拷贝或者移动数组的内容。这个是要手动完成的。
C语言的强大之处之一就是内存管理的权限比较大。
====================
函数入口时全部入栈是对的。
数组是运行时临时分配空间的。但是你指定大小了。就不能动态分配了。
如果要动态分配,得重新开辟内存空间,然后拷贝或者移动数组的内容。这个是要手动完成的。
C语言的强大之处之一就是内存管理的权限比较大。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询