首先,我們要知道的一點是:C/C++ 由于為了提高程序的運行效率,編譯器不會對數(shù)組越界進行檢查(也就是說數(shù)組越界編譯時并不會報錯),以下,我總結(jié)出了三個在VS下由于數(shù)組越界導(dǎo)致程序異常甚至崩潰的情況:
1. 超速行駛被交警攔下(Stack around the variable 'array' was corrupted.)
實例代碼如下:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(){
int array[10];
array[10] = 20;
cout << array[10] <<endl;
system("pause");
return 0;
}
編譯OK.
運行之后的現(xiàn)象:
分析:
這種屬于剛剛越界的情況,它會導(dǎo)致程序一直在執(zhí)行.所以如果在運行過程中出現(xiàn)了這種異常,那么想一想,是否記錯了數(shù)組的下標范圍是0~n-1,而你錯寫成了n,導(dǎo)致超速被交警攔下.
2. 不僅超速還妨礙了他人的車輛(VS下典型的0xC0000005異常)
實例代碼如下:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(){
int array[10];
array[12] = 20;
cout << array[12] <<endl;
system("pause");
return 0;
}
編譯OK
運行之后現(xiàn)象:
分析:
這種是數(shù)組越界的典型情況,原因是你越界訪問之后修改了其他不該修改的內(nèi)存,所以導(dǎo)致發(fā)生沖突.程序崩潰.超速了還影響了他人的駕駛,被交警攔下.
3. 超速行駛沒被交警抓到(編譯通過,程序正常運行正常退出)
實例代碼如下:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(){
int array[10];
array[11] = 20;
cout << array[11] <<endl;
system("pause");
return 0;
}
編譯OK,程序正常運行正常退出.
分析:
這種屬于比較巧的情況,可以理解為你越界訪問的那塊內(nèi)存上沒有任何的東西,形象地說 你超速行駛在無人監(jiān)管的路段上,沒有交警來攔你,當然超速仍然是錯誤的行為.有一點需要注意的是在VS下,總會有那么4個字節(jié)是無人監(jiān)管區(qū),本人做過測試,在數(shù)組越界后的第5~8個字節(jié)總是無人監(jiān)管區(qū),目前尚不清楚是什么原因.
總結(jié):
數(shù)組越界是一個很嚴重的問題,如果程序崩潰,它通常定位不到出錯的那塊代碼,一旦代碼量大,數(shù)組越界尋找錯誤是一件很麻煩的事情,一定要避免數(shù)組越界.