函數返回引用和指針類型

新博客地址: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

 

其他幾點:

函數退出時局部變量出棧,對象肯定是銷燬了。

銷燬指的是將那塊內存標爲空閒供其它變量使用,而該內存上的值仍然存在。

【釋放後那塊內存並不是馬上就被其他地方佔用,根據實際情況起碼會空閒一會,可能是一瞬間。如果你的程序較複雜,那這塊內存可能很快就再次被使用,如果程序很簡單,可能在很長一段時間內都是空閒。

所以在函數返回後將變量的值馬上賦值給另外一個變量,局部變量已經銷燬了,這塊內存上的值還沒來得及被修改,所以你的外部變量獲得了一個正確的值。

所以你的結果正確並不代表變量沒有被銷燬。無論用引用還是變量來接受局部變量的值,局部變量肯定是已經銷燬了的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章