我认为一旦函数返回,所有在其中声明的局部变量(禁止带有static关键字的那些)都是垃圾收集的.但是当我尝试下面的代码时,它仍会在函数返回后打印该值.谁能解释为什么?
int *fun();
main() {
int *p;
p = fun();
printf("%d",*p); //shouldn't print 5, for the variable no longer exists at this address
}
int *fun() {
int q;
q = 5;
return(&q);
}
Run Code Online (Sandbox Code Playgroud)
如果你真的希望它放松这个值,也许在调用printf之前调用另一个至少包含几行代码的函数,然后再访问该位置.很可能那时你的价值会超过你的价值.
但同样如上所述,这是未定义的行为.你永远无法预测它何时崩溃或变化.但是你不能依赖它"改变或保持不变"并用任何这些假设编写应用程序代码.
我想要说明的是,当你从前一个函数返回后再进行另一个函数调用时,另一个激活记录被推送到堆栈,最有可能是写入前一个,包括你通过指针访问其值的变量.
一旦一个函数和它的数据超出范围,任何实体都不会实际上是垃圾收集或做一个说memset 0.