C语言非常重视运行时的效率,所以没有进行数组越界检查,而C++继承了C的效率要求,自然也不做数组越界检查。(检查数据越界,编译器就必须在生成的目标代码中加入额外的代码用于程序运行时检测下标是否越界,这就会导致程序的运行速度下降)
例如下面这段代码:
int a[2];//定义一个长度为2的int型数组a
a[0] = 1;
a[1] = 2;
a[2] = 4;//越界
for (int i = 0; i < 3; i++)
printf("%d\t", a[i]);
printf("\n");
for (int i = 0; i < 3; i++)
printf("%d\t", &a[i]);
运行的结果如下:
第一行输出结果是a[0]、a[1]、a[2]的值,第二行分别输出它们三个的地址。可以发现他们在内存中是连续的。(int类型大小为4字节)
分析:
数组越界后,会自动接着前面那块内存往后写,这样带来的将会是一系列安全问题。因为界外的内存不确定是否已经存放了东西,如果不凑巧存放着比较重要的数据,那么数组越界后将会把这块内存上的重要数据替换掉,后果可想而知。
所以还是需要程序员对自己的代码负责,如果写代码的时候细心点就不会出现这种问题,况且还可以用STL作越界检查。