为什么在C中可以访问绑定数组?

可能重复:
数组索引在C中超出范围
可以在其范围之外访问局部变量的内存吗?
C没有越界错误

我正在尝试这段代码,

#include  main(){ int a[2],i; a[5] = 12; for(i=0;i<10;i++){ printf("%d\n", a[i]); } return 0; } 

它给了我输出:

 1053988144 32767 0 3 0 12 -1267323827 32716 0 0 

为什么[5]可以访问? 不应该通过RunTime错误吗?

int a[2]; 表示“分配2 * sizeof(int)内存”

a[5]*(a + 5)句法糖,它指向记忆区域a + (5 * sizeof(int)) 。 所以3 * sizeof(int)超过了数组的末尾。 哪里是? 谁知道?

有些语言确实绑定了检查,我听说过一些C编译器也能做到这一点,但大多数都没有。 为什么不做绑定检查? 性能。 性能是首先使用C的主要原因。 但这没关系,因为C程序员是优秀的程序员, 从不超出数组的范围。 (希望)

C没有对数组访问进行边界检查,所以不应该这样做。 语言中没有任何东西可以阻止您尝试读取您可以想象的每个(虚拟)地址,尽管操作系统和/或计算机本身通常会产生抗议,这可能会产生某种exception。 请注意,仅仅因为你“可以”(它编译并运行,似乎没有任何不良影响),这并不意味着程序有效或“工作”。 无效内存访问的结果是未定义的行为

不对索引边界执行任何控制。 这就是C的工作方式。