我被告知这是真的(在皮尔逊的书中如何编程),但是在NetBeans的ide中编译时,
以下功能代码
int n[5] = {6, 5, 4, 3, 2, 1, 2, 3, 2};
不会导致编译时错误,但会在程序中进一步导致意外行为。访问阵列中不应存在的位置也不会导致语法错误。
printf("%d", n[7]);
我错过了什么吗?
答案 0 :(得分:4)
是的,这段代码错了:
int n[5] = {6, 5, 4, 3, 2, 1, 2, 3, 2};
每 6.7.9初始化,the C standard第2段:
<强>约束强>
初始化程序不应尝试为对象提供值 包含在正在初始化的实体中。
如评论中所述,这是一个约束违规和语义错误,必须由编译器报告。我会说任何未能报告此错误的编译器都是不足的。
答案 1 :(得分:1)
是的,这是C中的约束违规(又名“错误”)。尽管如此,将其称为“语法错误”是不正确的。声明中的语法没有任何问题。
此规则的唯一例外是当字符串文字表示初始值设定项时,允许尾随零终结符“掉落”字符数组的末尾
char str[5] = "Hello";
即使终止\0
字符适合数组,上述内容在C中也有效。 (\0
字符在不适合时将被丢弃。)
如果您的编译器对您的声明发出警告,则通过发出警告,它正式符合标准要求。像GCC这样的编译器会在-pedantic-errors
模式下发出错误。