在数组初始值设定项列表中提供的初始值设定项是否比数组中的元素语法错误多?

时间:2017-09-11 00:17:21

标签: c arrays

我被告知这是真的(在皮尔逊的书中如何编程),但是在NetBeans的ide中编译时,

以下功能代码

int n[5] = {6, 5, 4, 3, 2, 1, 2, 3, 2};

不会导致编译时错误,但会在程序中进一步导致意外行为。访问阵列中不应存在的位置也不会导致语法错误。

printf("%d", n[7]);

我错过了什么吗?

2 个答案:

答案 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模式下发出错误。