这在C语言中是无效的。它只对代码进行了较少的检查。这是未定义的行为。
来自:C11草案N1570;6.7.9初始化
引用:
限制
2.没有初始化器应尝试为未包含在正在初始化的实体中的对象提供值。
3.要初始化的实体的类型应为大小未知的数组或不是变长数组类型的完整对象类型。
肯定违反了限制2。一个int
是一个完整的对象类型吗?
来自附录J.2(未定义行为):
标量的初始化程序既不是单个表达式,也不是括在花括号中的单个表达式(6.7.9)。
额外信息:
@James Kanze:
prog.c:4:12: error: expected identifier or ‘(’ before numeric constant
int i = 1,2,3,4,5
^
你可以这么做,但是需要将它变成一个表达式:
int i = (1,2,3,4,5); //need parenthesis, evaluates to 5, values 1-4 thrown away.
使用用初始化列表初始化的int
编译时会产生警告(在gcc中):
prog.c:5:2: warning: excess elements in scalar initializer [enabled by default]
int j = {1,2,3,4,5}
^
但似乎编译器足够智能,只初始化整数而不是其后的内存。
演示
array2
的声明,但唯一有问题的行是array1
的那一行。 - Mike Seymour