超出索引C / C ++

C / C ++中数组的典型声明是:

类型名称[elements];

其中type是有效类型(例如int,float …),name是有效的标识符,elements字段(始终用方括号[]括起来),用数字表示数组的长度元素。

所以我声明一个int数组有2个元素

int a[2]; a[3] =4; 

为什么这不会抛出exception?

越界检查是您可能习惯于从Java等高级语言中学习的东西。 但是在C / C ++中,默认情况下不会这样做。 它为您提供了一个小的性能命中来检查数组的边界,因此C的基本原理是让您手动执行它以防您需要它以提供最佳性能。 像vector这样的C ++ STL容器通常支持at()操作来执行绑定检查,因为你可以重载[] -operator,你也可以启用数组样式访问的绑定检查。

如果array是一个原始指针,那么像array[i]这样的语句在C / C ++中归结为:

 *(array + i) 

这是地址+偏移的简单添加。 因此,以下陈述是等效的:

 *(array + i), *(i + array), array[i], i[array] 

内部发生的是你获取存储在指针中的地址,将数组大小的i-times加到其中,然后取消引用该地址。

因此,如果指定的索引大于数组,则会访问不属于该数组的内存。 实际上,您可以读取内存中数组旁边的随机数据。 如果写入地址,这是缓冲区溢出的典型来源。 如果您尝试访问的内存不属于您的进程,则会出现段错误。

‘a’只是指向内存中第一个元素(该数组)的指针。 一些编译器将允许您访问内存的其他部分,而不会给您一个警告。 有关正确使用数组的信息,请参阅http://www.cplusplus.com/doc/tutorial/arrays/,即使用类似的内容

 #define MAX 5 int main(){ int a[MAX]; for(int i=0;i