2016-12-26 93 views
-3

我一直認爲如果我訪問的數組索引大於數組大小會導致運行時錯誤?但它似乎很高興運行並輸出零。這個編譯器是特定的還是OS特定的?訪問數組大小大於數組大小的數組索引時,某些不同的環境是否會導致運行時錯誤?訪問數組索引大於數組大小

例如;

int foo[5]; 
cout << foo[5] << endl; 


vector<int> bar(5); 
cout << bar[5] << endl; 
+6

未定義的行爲,它是... –

+0

[未定義的行爲鏈接上SO](http://stackoverflow.com/a/1239977/620908) - 也被稱爲[鼻惡魔](http://catb.org/行話/ HTML/N /鼻demons.html) –

回答

1

訪問它的邊界之外的數組它不是C++運行時錯誤:它是不確定的行爲,這意味着任何事情都可能發生,包括什麼都沒有。

在C++中沒有「運行時錯誤天使」,只有「未定義的行爲守護進程」。

1

那麼,你提供的代碼是未定義行爲的典型例子。

我一直認爲如果我訪問的數組索引大於數組大小,它會導致運行時錯誤?

載體類.at(size_type pos)方法執行邊界校驗,並拋出std::out_of_range如果pos不是在容器的範圍內。

vector#at documentation

0

這是不確定的行爲試圖讀取或寫入超出了數組的邊界,如果它是一個動態數組,該程序可能會崩潰。

char c1[] = "123"; 
char c2[2] = "A"; // ok c2[0] = 'A', c2[1] = '\0'; 

cout << c1 << endl; // 123 ok 
cout << c2 << endl; // A ok 

c2[5] = 'M'; // writing to the out bound of the array 

cout << c1 << endl; // 1M3 ??!! 
cout << c2 << endl; // A ok 

它導致內存dongling在這裏。