#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
?
答案 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)
,以防您不想使用该程序的任何命令行参数。