2014-02-07 66 views
-1

我正在學習C++,據我瞭解,如果您嘗試將值分配給無效數組,因爲數組的大小限制,無法填充數組,但下面的代碼是否正確輸出232:C++:創建大於大小的數組索引不會導致錯誤

int stuff[5]; 
stuff[7] = 232; 
cout<<stuff[7]; 

對不起,如果這是一個令人難以置信的愚蠢的問題,但是這只是一些我的編譯器修補之前運行的時間?

+1

這就像是說,「看,我*可以*握住球在我的手中」在籃球。 –

+2

更像是「我的駕駛執照被撤銷了,那麼爲什麼我能夠進入汽車並開車呢?」 – PaulMcKenzie

+0

這就像一個籃球運動員說:「看,我可以把球拿在手裏」,然後根據其他球員的位置決定是否繼續這樣玩。 –

回答

6

在數組邊界之外寫入是未定義的行爲,這意味着結果可能是任何東西。特別是,編譯器不需要添加任何運行時邊界檢查,這會導致發出錯誤消息(大多數編譯器不會,因爲它不會更高效)。

因此,可能發生的情況是該值正被寫入剛剛超過數組末尾的內存位置。如果存儲了重要的東西,就會發生不好的事情;或者如果發生在那個地方的事情不是那麼重要,你不會注意到任何特別的影響。儘管如此,你不能依賴於它是無害的。 :)

+0

完美,這是我需要的答案。我對另一個更模糊的答案感到不滿意。 –

+0

有沒有辦法看到甚至控制內存中的確切位置? –

+0

好吧,這裏有新的展示位置,但除非你真的知道你在做什麼,否則你不想使用它。一般來說,編譯器會做一個更好,更可靠的工作,將事物放在一個合適的位置,而不是人的意志。試圖爲它做好工作只會讓你和你不滿。 ;) –

2

訪問數組越界會導致未定義的行爲。它可能工作,它可能會給出錯誤的答案,它可能會導致程序崩潰,無論如何。

+0

什麼決定結果是什麼?編譯器?操作系統?硬件? –

+2

對兩者都是。也是運氣。 – Adam

+0

@亞當這樣的自信。 :P –

相關問題