比如下面这段代码
int main(){
int a[5] = {11,12,13,14,15};
a[7] = 16; // 越界了,运行至此时没报错
for(int i=0; i != 9; i++){
cout << "a[" << i << "] = " << a[i] << endl;
} // 程序运行到a[7]、a[8]是也未中断
return 0;
}
运行结果如下:
在编译的时候没有任何错误,在运行的时候可以看到越界访问a[7]时,没有报错。只是在程序最后检测到了错误,运行中越界访问没有问题。
内存越界引用
在深入理解计算机系统一书中,3.10.3节说了:“C语言对于数组引用不进行任何边界检查”。所以在程序运行时并不报错,而在本书3.10.1节也说了,数组引用如a[7]、指针运算和间接引用(如*(a+7)),有一样的效果。
因此,包括字符串、指针、数组的操作越界,是不会报错的——除非越界访问到了不可读的内存地址。
另外,程序员应该避免越界访问,增强程序的安全性。
缓存区溢出导致的字符串越界访问,还会成为别人攻击系统的接口(见书本3.10.3)。