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

Aas*_*h P 2 c arrays

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

我正在尝试这段代码,

#include <stdio.h>

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

它给了我输出:

1053988144
32767
0
3
0
12
-1267323827
32716
0
0
Run Code Online (Sandbox Code Playgroud)

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

unw*_*ind 5

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