首先,我們要知道的一點(diǎn)是:C/C++ 由于為了提高程序的運(yùn)行效率,編譯器不會(huì)對(duì)數(shù)組越界進(jìn)行檢查(也就是說(shuō)數(shù)組越界編譯時(shí)并不會(huì)報(bào)錯(cuò)),以下,我總結(jié)出了三個(gè)在VS下由于數(shù)組越界導(dǎo)致程序異常甚至崩潰的情況:
1. 超速行駛被交警攔下(Stack around the variable 'array' was corrupted.)
實(shí)例代碼如下:
#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.
運(yùn)行之后的現(xiàn)象:

分析:
這種屬于剛剛越界的情況,它會(huì)導(dǎo)致程序一直在執(zhí)行.所以如果在運(yùn)行過(guò)程中出現(xiàn)了這種異常,那么想一想,是否記錯(cuò)了數(shù)組的下標(biāo)范圍是0~n-1,而你錯(cuò)寫(xiě)成了n,導(dǎo)致超速被交警攔下.
2. 不僅超速還妨礙了他人的車(chē)輛(VS下典型的0xC0000005異常)
實(shí)例代碼如下:
#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
運(yùn)行之后現(xiàn)象:

分析:
這種是數(shù)組越界的典型情況,原因是你越界訪(fǎng)問(wèn)之后修改了其他不該修改的內(nèi)存,所以導(dǎo)致發(fā)生沖突.程序崩潰.超速了還影響了他人的駕駛,被交警攔下.
3. 超速行駛沒(méi)被交警抓到(編譯通過(guò),程序正常運(yùn)行正常退出)
實(shí)例代碼如下:
#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,程序正常運(yùn)行正常退出.
分析:
這種屬于比較巧的情況,可以理解為你越界訪(fǎng)問(wèn)的那塊內(nèi)存上沒(méi)有任何的東西,形象地說(shuō) 你超速行駛在無(wú)人監(jiān)管的路段上,沒(méi)有交警來(lái)攔你,當(dāng)然超速仍然是錯(cuò)誤的行為.有一點(diǎn)需要注意的是在VS下,總會(huì)有那么4個(gè)字節(jié)是無(wú)人監(jiān)管區(qū),本人做過(guò)測(cè)試,在數(shù)組越界后的第5~8個(gè)字節(jié)總是無(wú)人監(jiān)管區(qū),目前尚不清楚是什么原因.
總結(jié):
數(shù)組越界是一個(gè)很?chē)?yán)重的問(wèn)題,如果程序崩潰,它通常定位不到出錯(cuò)的那塊代碼,一旦代碼量大,數(shù)組越界尋找錯(cuò)誤是一件很麻煩的事情,一定要避免數(shù)組越界.