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

时间:2009-08-29 21:06:29

标签: c++ c arrays

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

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

或者,这会有效吗?

int foo[10] = {0};

4 个答案:

答案 0 :(得分:27)

在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之间唯一重要的区别)。有价值与默认初始化的整个情况相当复杂,所以如果你有兴趣看到这个答案:Do the parentheses after the type name make a difference with new?

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

答案 1 :(得分:18)

int foo[10] = {0};

这很好:)


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

int foo[10] = {1};

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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