返回信息流c++里面,函数不能返回局部变量的指针或者引用吧,因为函数调用完成后栈会弹出,局部变量都将销毁。
可是,下面的例子却可以正确运行:
```c++
#include <iostream>
using namespace std;
int *func(int a, int b)
{
int c = a + b;
return &c;
}
int main()
{
cout << *func(3,4) << endl;
}
```
编译虽然有个warning,但运行可以输出正确的结果 7
=====更新=====
查到了相关解释:
1. [StackOverflow - how to access a local variable from a different function using pointers](https://stackoverflow.com/questions/4570366/how-to-access-a-local-variable-from-a-different-function-using-pointers)
这是一条镜像帖。来源:北邮人论坛 / cpp / #95416同步于 2017/6/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
c++函数返回局部变量指针(引用)的疑问
Footprints
2017/6/1镜像同步22 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
那是因为你运气好。你这是在windows下的吧。换个编译器这程序就不能正常跑了。
```
(gdb) r
Starting program: /home/kexin/a.out
Program received signal SIGSEGV, Segmentation fault.
0x00000000004008dc in main () at test.cpp:13
13 cout << *func(3,4) << endl;
(gdb)
```
很多书上说了,不要这么干。并不是说这种一定出错。不同的编译器都会不一样。你这种我在vs里面确实没问题,就一个警告。本质就在于局部变量确实被销毁了而不是内存被销毁了,所以那块内存上的值不一定不存在了,你返回的是一个引用,可以理解为一个地址,如果你再去读这个地址,确实值还存在。你可以考虑下delete到底干了些什么事。不让你这么干是有道理,毕竟存在风险。
mac下,你那个是linux下么
【 在 NachtZ 的大作中提到: 】
: [md]
: 那是因为你运气好。你这是在windows下的吧。换个编译器这程序就不能正常跑了。
: ```
: ...................
电脑冒烟了吗?
局部变量的生存期从这个块开头(函数开头)开始,到这个块末尾(函数末尾)结束。超出了生存期,指向它的指针就变成了无效指针。对生存期结束的存储空间(变量)的访问,在C语言里是”未定义行为“,什么都允许发生,从什么都不发生到机器冒烟都是允许的。在这个范围里,”貌似可以执行“也是允许出现的结果,”segmentation fault“也是允许出现的结果。
如果碰巧能执行,纯属运气好。也可以说运气不好,有bug没能及时发现,等系统规模变大以后,bug就会变得越来越难找。你会很希望程序早点崩溃。
看到这个帖子第一反应就是暖神的电脑冒烟。果然出现了。
【 在 nuanyangyang (暖羊羊) 的大作中提到: 】
: 电脑冒烟了吗?
: 局部变量的生存期从这个块开头(函数开头)开始,到这个块末尾(函数末尾)结束。超出了生存期,指向它的指针就变成了无效指针。对生存期结束的存储空间(变量)的访问,在...
: ...................
我前两天在知乎上看到这个问题[em12]有个解释还挺好玩的
【C 语言局部变量,堆与栈的问题?】夏季:我是一个国王,我的名字叫i,一个蠢蠢的程… https://www.zhihu.com/question/60415017/answer/175947897?utm_source=qq&utm_medium=social (分享自知乎网)
通过『我邮2.0』发布