程序如下:
#include <iostream>
using namespace std;
void fuck(int *&j)
{
int l = 20;
int *k = &l;
j = k;
k = 0;
}
void any_function_use_local_variables()
{
int a, b, c;
a=b=c=100;
}
int main()
{
int i = 10;
int *j = &i;
fuck(j);
/////-------------------------
cout < <*j < <endl;
////-------------------------
cout < <*j < <endl;
any_function_use_local_variables();
////-------------------------
cout < <*j < <endl;
//
cout < <*j < <endl;
return 0;
};
打印結果,四次cout < <*j < <endl;結果都不同,依次是:
20
274148040
-858993460
274148040
這個我開始就不太明白了,明明fuck了局部變量為什么還能得到20的值,j應當指向一塊不確定的內存區域,卻有了幾次不一樣的結果。
于是在論壇里面貼了出來,自己也查了很多資料試驗了很多程序。
原因我的理解基本是這樣:
第一個輸出時因為是剛剛返回 ,雖然局部變量銷毀了.
(我的理解銷毀:就是我放棄了這個地方了.原來我在那放了一個蘋果,在沒人用這塊地方時蘋果還在)
所以第一個輸出還是20。之后這塊內存應該被用過了,所以變成了其它的值。
下面是一位牛人的回復,挺有道理!
///////////////////
第一次輸出:在void fuck(int *&j) 函數中,聲明的局部變量K,假設地址為oxff71,在函數中,這個地址賦值給了j;
然后,函數中的局部變量K所指的內存的值為20;然后,fuck函數結束,局部變量的內存被釋放,單這個釋放只是說明了這塊內存可以被重新使用,并不是把內存里的數值歸0了,所以。在第一次輸出的時候,*j為20;
第2次輸出:其實cout < <也是調用了一個函數,這個函數怎么實現我并不知道,但是有理由相信,在這個函數中是要使用一些局部變量的,那么當第一次輸出了*j以后,這個函數或許沒有結束,它里面的局部變量使用了剛剛fuck釋放的那塊內存,然而又有局部變量使用了oxff71這個地址,但是變量J所指的地址也正好是這樣,所以,輸出了另一組數字。
第3次輸出:在調用了any_function_use_local_variables()這個函數后,其實我們可以把any_function_use_local_variables 這個函數簡化下, 簡化成下面這樣
void any_function_use_local_variables()
{
int a=10;
int b =100;
}
通過代碼跟蹤調試可以知道,any_function_use_local_variables函數還是使用了fuck釋放的內存,因為我們可以清楚的看到 b的地址是oxff71,所以第3次輸出的就是100了。
其實我們可以在3個cout < <*j < <endl以后在加一個 cout < <*j < <endl,可以看到第4個輸出和第2個輸出是一樣的,從而就證明了我對第2次輸出的猜想。