我一直認爲如果我訪問的數組索引大於數組大小會導致運行時錯誤?但它似乎很高興運行並輸出零。這個編譯器是特定的還是OS特定的?訪問數組大小大於數組大小的數組索引時,某些不同的環境是否會導致運行時錯誤?訪問數組索引大於數組大小
例如;
int foo[5];
cout << foo[5] << endl;
vector<int> bar(5);
cout << bar[5] << endl;
我一直認爲如果我訪問的數組索引大於數組大小會導致運行時錯誤?但它似乎很高興運行並輸出零。這個編譯器是特定的還是OS特定的?訪問數組大小大於數組大小的數組索引時,某些不同的環境是否會導致運行時錯誤?訪問數組索引大於數組大小
例如;
int foo[5];
cout << foo[5] << endl;
vector<int> bar(5);
cout << bar[5] << endl;
訪問它的邊界之外的數組它不是C++運行時錯誤:它是不確定的行爲,這意味着任何事情都可能發生,包括什麼都沒有。
在C++中沒有「運行時錯誤天使」,只有「未定義的行爲守護進程」。
那麼,你提供的代碼是未定義行爲的典型例子。
我一直認爲如果我訪問的數組索引大於數組大小,它會導致運行時錯誤?
載體類.at(size_type pos)
方法執行邊界校驗,並拋出std::out_of_range
如果pos
不是在容器的範圍內。
這是不確定的行爲試圖讀取或寫入超出了數組的邊界,如果它是一個動態數組,該程序可能會崩潰。
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在這裏。
未定義的行爲,它是... –
[未定義的行爲鏈接上SO](http://stackoverflow.com/a/1239977/620908) - 也被稱爲[鼻惡魔](http://catb.org/行話/ HTML/N /鼻demons.html) –