2016-03-27 67 views
1

如果我運行下面的代碼,它顯示一個很長的數字。爲什麼unassigned int有一個值?

int i;  
int *p;  
p= &i;  
cout<<*p; 

爲什麼unassigned int有一個值?那價值是什麼?

+3

未定義,但最常見的情況是在那裏。 – Thomas

+6

爲什麼要在這裏引入'p'?你也可以發佈'int i; cout << i;'。 – WhozCraig

回答

-1

變量i的內存位置(堆棧中)的當前內容。

4

因爲這是「未定義行爲」在C++中的意思。

「未定義的行爲」意味着「任何事情都是可能的」。這包括:

  • 您得到一些對象的隨機值。每次運行代碼時,它總是可以相同或不同。

  • 該程序崩潰。

  • 您的計算機開始播放最新的賈斯汀比伯視頻,無法自行停止播放。

  • 如你所知,宇宙即將結束。

etc ......這就是「未定義行爲」的含義。

+0

雖然代碼段中存在UB,但OP詢問爲什麼*指針*有一個值,而不是爲什麼指向的對象有一個值。 –

+0

@TheodorosChatzigiannakis:標題和代碼闡明他實際上在詢問'int',最後一句話只是措辭不佳。 –

+3

人們可以停止製造關於UB的蹩腳笑話嗎? – Lumen

5

指針p的值是int i的地址。您爲其分配的地址爲&運營商:p = &iint i本身並未初始化,也稱爲默認初始化。當您使用*p取消引用您的指針時,您將獲得未初始化的值int i,這可能是任何值。

您的int i的值是未初始化的內存,解釋爲int。使用未初始化的變量是未定義的行爲。

你也將有沒有一個指向相同的行爲通過簡單地做:

int i; 
cout << i; 
+1

或多或少正確,但未初始化的本地值不是該內存位置的剩餘位 - 值爲* indeterminate *。不確定的事實是調用未定義的行爲,因爲你在最後正確地聲明。就編譯器而言,未初始化的局部變量可能不存在。 –

+0

@TheodorosChatzigiannakis感謝您指出這一點。我會相應地編輯答案。 – robsn

+1

雖然也值得注意的是,如果該類型特別是'unsigned char',它仍然是不確定的,但它不一定是UB來讀取它。 –

0

僅僅是因爲內存位置是有一定的價值(這是任何值)。正如Sam指出的那樣,這是一個未定義(和不需要)行爲的好例子。

0

因爲變量不能爲空。

計算機內存的每個字節總是包含一些內容。

計算機程序通常不會清理內存(出於速度的原因),因此,當您保留一個未初始化的變量時,它將有一些隨機(或多或少)的值留在這個地方內存由另一個程序或我們自己的代碼。

通常它是0或最近被破壞的某個其他變量或某個內部指針的值。

1

想象一下,你想買一塊土地,你打算建一座房子。要購買土地,請聯繫當地土地賣方。

enter image description here

你需要告訴他你的需要的土地多臺。作爲回報,他會告訴你這片土地的位置。

完成 - 您的土地已準備好使用。但你有沒有注意到什麼?土地賣方只告訴你土地的座標。他沒有對這片土地說什麼。在這塊土地上可能已經有了房子。甚至可能有酒店或機場。誰知道那裏有什麼?如果你嘗試使用土地,而不是先建房子,那麼你不能保證會有什麼。作爲土地所有者,您有責任在土地上建造一些東西,並在適當的時候使用它。

C/C++與上例相同。詢問int,就像是要求一個8個單位的土地。 C/C++會給你土地,告訴你它的座標。它不會告訴你這塊土地是什麼。你有責任使用這塊土地把房子放在屋頂上。如果你沒有放置房子,並嘗試進入「房子」,你可能會在機場結束。希望現在更清楚:)。

相關問題