tempad
ReadyGo!技术成就梦想 >>数据库技术 >> 函数返回值是指针的问题,牵涉到生存期问题!

函数返回值是指针的问题,牵涉到生存期问题!

ReadyGo!技术成就梦想 网络搜索 efish 2008-1-13 8:41:27

函数返回值是指针的问题,牵涉到生存期问题!

楼主jacky_mo(把你藏起来)2003-12-30 20:45:12 在 C/C++ / C语言 提问

有这么一段程序,很简单的:  
  #include   <iostream.h>  
   
  int   *   func()  
  {  
  int   a=99;  
  return   &a;  
  }  
   
  void   main()  
  {  
    int   *p=func();  
    cout<<*p<<endl;/*按照道理来讲,指针p所指向的内存到这里就被清除掉了,可还在*/  
    *p=500;                
    cout<<*p<<endl;  
  }  
  程序的输出结果是:99  
                                    500  
  按照理论上来说,func函数中的变量a是一个局部变量,也就是意味着这个函数被调用完毕之后,这个变量在栈中的空间会被立刻释放,所以从理论上来说返回这个局部变量的地址是无效的,由于局部变量的内存空间已经被释放掉,所以*p应该是会出错。  
  可理论归理论,从程序的运行结果看,证明我的观点是错的。  
  我这样理解是可以行的通的:就是局部变量的内存空间没有被立刻释放掉,而是有了延迟,这样的话,上面的程序结果是行的通的。  
  不知道我的理解错与否,问一下各位朋友!  
   
  问题点数:50、回复次数:8Top

1 楼Lastcsdner(外行)回复于 2003-12-30 21:03:56 得分 10

举个简单的例来说明一下你的心态:一条路上有个地雷,但我的确走过去了,  
  而且没有踩着那个地雷,这能说明那条路上没有地雷吗?来回多走几趟,肯定  
  会中招的。  
  PS,如果把那个变量a申明成static的,倒是可以。Top

2 楼tuxw(醉书生)回复于 2003-12-30 21:11:11 得分 10

对于“返回无效地址”可能存在误解  
   
  func()   确实返回了当初分配a时的地址,之所以说是无效的,是因为函数返回后访地址所表示的空间被收回,系统随时可能会再将它分配为其它用途,而不管怎样,p确实指向了它,所以用p操作它是允许的,至于是否出错,上面的地雷比较形象了Top

3 楼tuxw(醉书生)回复于 2003-12-30 21:16:53 得分 10

你甚至可以  
   
  char   far   *p   =   (char   far   *)0x12345678;     //   随便赋一个值就是将p随便指一个地址  
  *p   =   0x55;   //   你不用知道这个空间是干什么的,但你确定可以操作它  
                        //且大多数情况下你不会感觉到系统有什么不对,但崩溃的可能随时存在  
   
   
  以上代码之测试,出现任何问题责任自负,与我无关哈     :)Top

4 楼abitz(阿奈)(老婆永远是对的!)回复于 2003-12-30 21:19:58 得分 10

p所指单元已经释放了,你说的没错。但释放不等于改变其内容。  
  就好像你删除硬盘上的文件,只是删除了他的索引,而不是把那片存储区清0。  
  清0那是格式化。  
  你看看这个改过的程序,如果你对结果不感到惊讶,你就明白了。  
  int   *   func()  
  {  
  int   a=99;  
  return   &a;  
  }  
  void   foo()  
  {  
  int   a;  
  a   =   10;  
  }  
   
  void   main()  
  {  
    int   *p=func();  
    foo();  
    cout<<*p<<endl;/*按照道理来讲,指针p所指向的内存到这里就被清除掉了,可还在*/  
    *p=500;                
    cout<<*p<<endl;  
  }  
  运行结果:  
  10  
  500  
  Top

5 楼bluebohe(薄荷)回复于 2003-12-30 21:21:38 得分 5

空间虽然被释放掉,但是那个地址的值还暂时没变化,当声明了一个其他的变量并赋值后变化了Top

6 楼quickball()回复于 2003-12-30 22:42:49 得分 5

是因为,还没有别的程序代码将func的存储区覆盖掉。Top

7 楼jacky_mo(把你藏起来)回复于 2003-12-31 09:40:19 得分 0

感谢各位朋友,这样我的理解又更加加深了,马上结帖!Top

8 楼sharkhuang(走吧走吧!人总会慢慢长大~)回复于 2003-12-31 09:56:06 得分 0

不合法!但是能用哦!Top

责任编辑: efish 参与评论 查找更多:
相关文章
关闭浏览器的问题?急!!!! 关闭浏览器的问题?急!!!!
XviD解码时,遇到“整型被零除”的问题,求救

XviD解码时,遇到“整型被零除”的问题,求救

楼主cxf1976()2003-12-30 21:26:49 在 专题开发/技术/项目 / 多媒体/流媒体开发 提问

我现在使…

请问这求最大值的函数有什么错? 请问这求最大值的函数有什么错?
richTextBox选中的字体更改后出现的问题 richTextBox选中的字体更改后出现的问题
关于可连续重用程序包和非连续重用程序包的区别

关于可连续重用程序包和非连续重用程序包的区别

楼主zhanggok()2003-12-30 21:24:03 在 Oracle / 开发 提问

1可连续重用包     …

请问如结贴时"给分的和"与"原有分&q…

请问如结贴时"给分的和"与"原有分"比较的做法?

楼主look4sword(觅剑 | 劈柴、喂马、周游世界。
大调查:如果你是销售人员或售前人员请说出你的底薪…

大调查:如果你是销售人员或售前人员请说出你的底薪和一般的月薪。

2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想