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

标签 c++ c arrays

要用全零初始化一个 int 数组,我需要使用:

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

或者,这行得通吗:

int foo[10] = {0};

最佳答案

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

int foo[10] = {0};

将完全按照您的意愿行事。

这也适用于结构:

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

会将所有成员初始化为0。

标准(C99 - 6.7.8/12 - 初始化)是这样说的:

If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.

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

在 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? .

幸运的是,这种差异在实践中似乎并没有造成太大的麻烦,尽管如果您遇到它,在试图弄清楚行为到底应该是什么时,它可能会让人挠头一阵子。我通常不会考虑太多 - 这让我很头疼。

关于c++ - C 静态数组初始化——我需要多详细?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1352370/

相关文章:

c++ - 链接 boost 日志教程时出现链接器错误( undefined reference )

c++ - 编译时检查右移是否是有符号类型的算术

c++ - 奇怪的 Adob​​e Alchemy 编译器失败

c - Malloc 打印不正确?

java - 需要比较两个 ArrayList,但不断遇到异常,因为其中一个正在水平打印

arrays - 在 swift 5 中过滤结构的嵌套数组

c++ - 如何在更改文本后调整 QWidgetAction 显示的 QLabel 的大小

c - ARM 程序集 - 为什么我的应用程序在将 r7 归零时崩溃?

c++ - 如何链接英特尔 MKL 库,仅使用 cblas_dgemm 函数

java - 值没有存储在数组中?