这段代码如何成功编译?

时间:2016-06-10 18:40:21

标签: c arrays

#include <stdio.h>
main() {
    int a[1];
    a[0] = 1;
    a[1] = 2;
    a[2] = 6;
    printf("%d\n", a[2]);
}

虽然a是一个大小为1的数组,但为什么它会接受a[2] = 6

1 个答案:

答案 0 :(得分:3)

  

虽然a是大小为1的数组,但它是否接受[2] = 6?

认为 接受因为它会调用undefined behavior

数组在C中基于0进行索引,对于大小为1的数组,只有arr[0]是有效访问权限,甚至不是arr[1]。在这种情况下,尝试访问除0以外的任何其他索引将导致调用UB的越界访问。

默认情况下,C规范没有为数组索引提供任何绑定检查,因此您不会默认获得错误。但是,如果启用编译器警告,则至少应该能够获得提示。 FWIW,-Warray-bounds=1-O2应警告您。

也就是说,对于一般托管环境,main()的签名是int main(void),以防您不想使用该程序的任何命令行参数。