2013-03-15 189 views
0

所以,我有這樣的代碼:爲什麼沒有這個崩潰?

int randomNumber; 
int max = 16; 
int swap; 
int table[16]; 

srand(time(NULL)); 
for (int i = 0; i < 16; ++i) 
    table[i] = i + 1; 

for (int i = 0; i < 16; ++i) { 
    randomNumber = rand() % max; 
    swap = table[max]; 
    table[max] = tablica_losowa[losuj]; 
    table[losuj] = swap; 
    --max; 
} 

顯然,這個問題應該是第一次通過第二個for循環時最大== 16,我嘗試訪問表[MAX],但它編譯運行良好。

這是來自iPad(最新軟)應用程序,用Objective-C,XCode 4.6,Apple LLVM Compiler 4.2編寫。

任何提示?

回答

3

訪問其他東西所擁有的內存位置並不能保證崩潰,它只能保證你正在做某件你不應該做的事情。將發生什麼取決於內存位置以及如何使用。

編譯器根本沒有做任何事情在這裏引起問題。 Objective C基於C ...在某些方面它有點緊,但只要語法正確,C會讓你嘗試做很多事情,不管它多麼無效。在你的情況下,寫入表[16] 可能正在寫入一個不重要的內存位置。它可能會寫入swap,然後被覆蓋。檢查組件以確定。

+0

是的,你是對的,我意識到這一點,但當我訪問數組超出範圍時,我習慣了代碼崩潰。你知道這個行爲是否特定於Objective-C,iPad(內存管理?)還是編譯器?坦率地說,我正在尋找一個更深入的答案,如果有可能:) – Losiowaty 2013-03-15 11:16:20

+0

我認爲OP是來自Java或類似的背景,其中outOfBound異常生成並崩潰。 – 2013-03-15 11:16:29

+1

Losiowaty編譯器根本沒有做任何事情來解決這裏的問題。我認爲@AnoopVaidya是正確的,你的經驗可能是在這種情況下,環境迫使崩潰的語言? Objective C基於C ...在某些方面它有點緊,但只要語法正確,C是一種語言,無論它有多麼無效,都可以讓你做很多事情。在你的情況下,寫入表[16]可能會寫入一個不重要的內存位置。它可能會寫入_swap_,然後被覆蓋。檢查組件以確定。 – mah 2013-03-15 11:20:48

0

問題是C(和Objective-C)沒有對「未定義行爲」給出任何保證。數組越界訪問table[16]就是這樣一個未定義的行爲(參見C11標準6.5.6)。

在未定義行爲的情況下,這種「不給予保證」的情況非常糟糕。你的程序然後可以自由地做任何事情。它可以從網絡攝像頭拍攝照片並在Facebook上發佈,向您的老闆發送冒犯性電子郵件,然後開始格式化您的硬盤。雖然不太可能,但這種行爲在語言表達方面完全有效。

因此,只是忽略錯誤並繼續執行程序顯然也很好。