C静态数组初始化 – 我需要多么详细?

要使用全零来初始化int数组,我是否需要使用:

int foo[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 

或者,这会工作:

 int foo[10] = {0}; 

 int foo[10] = {0}; 

这很好:)


请注意,如果您执行以下操作:

 int foo[10] = {1}; 

只有数组的第一个元素将使用非零数字进行初始化,而其余元素将使用零进行初始化。

在C / C ++中,如果仅使用值初始化已知大小的数组的第一个元素,则余数将为零填充,因此:

 int foo[10] = {0}; 

会做你想要的。

这也适用于结构:

 struct bar { int x; int y; char c; } myBar = {0}; 

将所有成员初始化为0。

标准(C99 – 6.7.8 / 12 – 初始化)说明了这一点:

如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应为隐式初始化与具有静态存储持续时间的对象相同。

在C语法中,语法要求在大括号内至少有一个“赋值表达式”。 ‘assignment-expression’可以是很多东西,从常量或标识符到更复杂的表达式。 但是,空字符串不符合’赋值表达式’,因此大括号之间必须有一些东西。

在C ++中,语法特别允许'{}’初始化程序,因此以下内容也会对数组进行零初始化:

 int foo[10] = {}; 

值得注意的是,在C ++中,初始化列表中没有特定初始化值的条目将是“值初始化”或“默认初始化”,这可能与零初始化不同,具体取决于构造函数对于变量类型是以及编译器是否遵循C ++ 98标准或C ++ 03标准(这可能是C ++ 98和C ++ 03之间任何重要性的唯一区别)。 有价值与默认初始化的整个情况相当复杂,所以如果你有兴趣看到这个答案: 类型名称后的括号是否与new有所不同? 。

幸运的是,差异似乎并没有在实践中造成太大麻烦,尽管如果遇到它,它可能会在试图找出行为真正应该是什么时引起一些人头疼。 我通常不太考虑它 – 这会让我头疼。

初始化程序中未提及的所有元素将在适用的情况下初始化为该类型的零值。

所以int foo [10] = {0}; 很好,未提及的其余元素也将为0

哇,C似乎很简单,但即使经过多年引用规范,令人惊讶的是新的东西仍然可以出现。

我只是在第一版规范(ANSI / ISO 9899-1990)中查找过,当然,还指定了自动聚合的其余部分(6.5.7)“如果有更少…隐式初始化……” 。

所以:任何非自动的。 始终为0(或初始化)是否已初始化。 自动:如果您初始化任何元素,则完全初始化,否则,未初始化。