可能重复:
Array index out of bound in C
Can a local variable's memory be accessed outside its scope?
C no out of bounds error
我正在尝试这段代码,
#include <stdio.h>
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错误吗?
答案 0 :(得分:5)
C没有对数组访问进行边界检查,所以不应该这样做。语言中没有任何东西可以阻止您尝试读取您可以想象的每个(虚拟)地址,尽管操作系统和/或计算机本身通常会产生抗议,这可能会产生某种异常。请注意,仅仅因为你“可以”(它编译并运行,似乎没有任何不良影响),这并不意味着程序有效或“工作”。无效内存访问的结果是未定义的行为。
答案 1 :(得分:4)
int a[2];
表示“分配2 * sizeof(int)
”
a[5]
是*(a + 5)
的语法糖,指向内存区域a + (5 * sizeof(int))
。所以3 * sizeof(int)
超过了数组的末尾。哪里是?谁知道?
有些语言确实绑定了检查,我听说过一些C编译器也能做到这一点,但大部分都没有。为什么不做限制检查?性能。性能是首先使用C的主要原因。但这没关系,因为C程序员是优秀的程序员,从不超越数组的界限。 (希望)
答案 2 :(得分:1)
不对索引边界执行任何控制。这就是C的工作方式。