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

问题:

#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这个地址内的值还是原先赋的值。

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

  • 22
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值