函数返回引用和指针类型

本文探讨了C++中局部变量的生命周期及其在栈内存中的管理方式,特别是当函数返回局部变量的指针时可能导致的问题。通过具体示例说明了如何避免因栈内存释放而导致的数据读取错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

新博客地址:http://gorthon.sinaapp.com/

 

结果如下:

h

printf

<这里是个乱码>

 

Press any key to continue 

或者下面这样:

 

结果也是乱码。

问题的解答:

 

以下摘自http://zhidao.baidu.com/question/156881190.html

 

首先局部变量在函数执行完后会被释放,这个毋庸置疑。
问题出在系统什么时候会释放被调用的函数栈数据。
如果在没有任何函数被调用时,原来的函数栈还是被保留的,直到调用了新的函数,新的函数栈冲掉了原来的函数栈。

因此,函数返回指针后,必须在下一个函数中立即取出,不然就被冲洗掉了。
 
上面的程序中有printf("printf ……/n")这一句的话结果如下:
&a = 12ff78  &b = 12ff70
&a = 12ff08  &b = 12ff10
return 12ff08
printf ……
0.000000  12ff08
0.000000  12ff08
3.900000  12ff64
Press any key to continue
没有printf("printf ……/n")这一句的话结果如下:
&a = 12ff78  &b = 12ff70
&a = 12ff08  &b = 12ff10
return 12ff08
3.900000  12ff08
0.000000  12ff08
3.900000  12ff64
Press any key to continue

 

其他几点:

函数退出时局部变量出栈,对象肯定是销毁了。

销毁指的是将那块内存标为空闲供其它变量使用,而该内存上的值仍然存在。

【释放后那块内存并不是马上就被其他地方占用,根据实际情况起码会空闲一会,可能是一瞬间。如果你的程序较复杂,那这块内存可能很快就再次被使用,如果程序很简单,可能在很长一段时间内都是空闲。

所以在函数返回后将变量的值马上赋值给另外一个变量,局部变量已经销毁了,这块内存上的值还没来得及被修改,所以你的外部变量获得了一个正确的值。

所以你的结果正确并不代表变量没有被销毁。无论用引用还是变量来接受局部变量的值,局部变量肯定是已经销毁了的。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值