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

时间:2012-07-06 12:58:11

标签: c arrays

  

可能重复:
  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错误吗?

3 个答案:

答案 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的工作方式。