C/C++中关于函数调用结束后变量释放的问题

时间:2022-01-06 02:28:42

问题:

#include <stdio.h>
int* fa();

void main()
{
int *p=fa();
printf("%d\n",*p);
}

int* fa()
{
int i=97;
return &i;
}

我记得书上说过当函数调用结束后,函数中所定义的局部变量会全部被释放,也就是函数fa()中的变量i在调用结束后会被释放,为什么这里还能引用输出函数fa()中的局部变量值呢?


解答:

其实这么引用很危险,非常不推荐。
fa()执行完毕后,i被释放,其实是指将编译器中对于该地址的控制给释放。
这块地址是存在的,但是已经没有受控的指针指向它。
&i目前也就成为我们所说的野地址。
当前这块地址有可能已经被其他程序/系统其他进程所使用,
也有可能还没有被使用。

所以当前*p指向的内容是不可预测的。

但是由于这个程序执行非常快,很大可能是&i这个地址内的值还是原先赋的值。

但是这么访问很危险,一旦这块地址已经被系统或者其他应用程序使用,对于它的访问,有可能导致异常。