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

jgo*_*ula 7 c c++ arrays

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

int foo[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Run Code Online (Sandbox Code Playgroud)

或者,这将工作:

int foo[10] = {0};
Run Code Online (Sandbox Code Playgroud)

Mic*_*urr 27

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

int foo[10] = {0};
Run Code Online (Sandbox Code Playgroud)

会做你想要的.

这也适用于结构:

struct bar {
    int x;
    int y;
    char c;
} myBar = {0};
Run Code Online (Sandbox Code Playgroud)

将所有成员初始化为0.

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

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

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

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

int foo[10] = {};
Run Code Online (Sandbox Code Playgroud)

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

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

  • C99标准不允许{}.C++ 11标准允许{}.gcc with -std = c99允许{}.gcc with -pedantic disallows {}. (2认同)

Ara*_*raK 18

int foo[10] = {0};
Run Code Online (Sandbox Code Playgroud)

这很好:)


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

int foo[10] = {1};
Run Code Online (Sandbox Code Playgroud)

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