函数返回值是指针的问题,牵涉到生存期问题!
函数返回值是指针的问题,牵涉到生存期问题!
楼主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
-
相关文章
XviD解码时,遇到“整型被零除”的问题,求救
楼主cxf1976()2003-12-30 21:26:49 在 专题开发/技术/项目 / 多媒体/流媒体开发 提问我现在使…
关于可连续重用程序包和非连续重用程序包的区别
楼主zhanggok()2003-12-30 21:24:03 在 Oracle / 开发 提问1可连续重用包 …
请问如结贴时"给分的和"与"原有分"比较的做法?
楼主look4sword(觅剑 | 劈柴、喂马、周游世界。大调查:如果你是销售人员或售前人员请说出你的底薪和一般的月薪。
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn
