函数返回后,局部变量仍然存在

Sex*_*ast 5 c local-variables

我认为一旦函数返回,所有在其中声明的局部变量(禁止带有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)

P.P*_*.P. 7

C中没有垃圾收集.一旦变量的范围不复存在,以任何方式访问它都是非法的.你看到的是UB(未定义的行为).


Luc*_*ore 6

它是未定义的行为,任何事情都可能发生,包括出现在工作中.内存可能还没有被覆盖,但这并不意味着你有权访问它.但你做到了!我希望你快乐!:)


fkl*_*fkl 5

如果你真的希望它放松这个值,也许在调用printf之前调用另一个至少包含几行代码的函数,然后再访问该位置.很可能那时你的价值会超过你的价值.

但同样如上所述,这是未定义的行为.你永远无法预测它何时崩溃或变化.但是你不能依赖它"改变或保持不变"并用任何这些假设编写应用程序代码.

我想要说明的是,当你从前一个函数返回后再进行另一个函数调用时,另一个激活记录被推送到堆栈,最有可能是写入前一个,包括你通过指针访问其值的变量.

一旦一个函数和它的数据超出范围,任何实体都不会实际上是垃圾收集或做一个说memset 0.