免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3761 | 回复: 7
打印 上一主题 下一主题

[C] 局部变量的生存期 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-24 16:56 |只看该作者 |倒序浏览
本帖最后由 gcc_linux_cpp 于 2011-06-24 16:58 编辑
  1. int * foo()
  2. {
  3.     int a = 5;
  4.     return &a;
  5. }

  6. int main()
  7. {
  8.     int* p = foo();
  9.     cout << *p;
  10.     *p = 8;
  11.     cout << *p;
  12. }
复制代码
代码如上,

嗯:a 是一个函数内部的local variable, 但我仍试图将其返回到函数体外,这样a的使用便超出了它的“生存期”;

现在问题是,为什么我可以得到'正确'的结果 (5,8 )呢?((gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)))


大家可以使用各自编译工具试试,希望能给出你们自己的观点哦!

PS: 在一些人看来,这简直就不是一个问题,但我还是希望大家能讨论一下。

我也增加点见识嘛!

论坛徽章:
1
技术图书徽章
日期:2013-09-09 13:47:26
2 [报告]
发表于 2011-06-24 17:08 |只看该作者

论坛徽章:
0
3 [报告]
发表于 2011-06-24 17:29 |只看该作者
结果要看运气。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
4 [报告]
发表于 2011-06-24 23:04 |只看该作者
纯粹是LZ所帖代码的话,大部分编译器应该都会给出正确结果,但这没有什么意义。

论坛徽章:
0
5 [报告]
发表于 2011-06-25 00:07 |只看该作者

  1. #include <iostream>

  2. using namespace std;

  3. int * foo()
  4. {
  5.     int a = 5;
  6.     return &a;
  7. }

  8. int g_test;

  9. void bar()
  10. {
  11.         int b = 7;
  12.         g_test = b;
  13.         return;
  14. }

  15. int main()
  16. {
  17.     int* p = foo();
  18.         bar();
  19.     cout << *p;
  20.     *p = 8;
  21.     cout << *p;
  22. }


复制代码

论坛徽章:
0
6 [报告]
发表于 2011-06-25 01:51 |只看该作者
很简单,因为你那块内存还没有被分配给其他。也就是还保持着原来的值,所以你运行结果一直是正确的。
运行结果看运气吧,如果操作系统分配给其他部分,你运行就错误了。

论坛徽章:
0
7 [报告]
发表于 2011-06-25 07:12 |只看该作者
顶LS的,其实就是内存区域的问题。
局部变量本身是分配的栈上空间,生命周期结束后,该块栈空间的内存所有权已经交回OS了,如果在该空间未分配给其它模块使用之前,应该都是不会变的,值正确很正常。

论坛徽章:
0
8 [报告]
发表于 2011-06-25 08:03 |只看该作者
回复 1# gcc_linux_cpp


    没有意义
    相当于对一个没有初始化的局部auto变量,输出其值一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP