8

在用 C 语言编写的程序的加载数据部分,我看到缓冲区的初始化是这样完成的:

char buffer[100] = {0, };

但我不确定此语句分配了哪些值。请分享一些想法。

这取决于编译器还是语言功能?

如果此语句等​​效于:在零之后使用逗号有什么意义:

char buffer[100] = {0};

是不是因为编码人员只想确保第一个元素为零,而不关心其余部分?

4

4 回答 4

12

这取决于编译器还是语言功能?

行为由语言标准指定。当前标准(C11 §6.7.9 Initialization / 21,位于第 141 页)描述了当您提供的初始化程序少于聚合元素时会发生什么:

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

因此,未指定的元素被初始化为\0.

于 2013-04-22T08:05:10.933 回答
6

使用给定的值(0在这种情况下为单个值),然后所有其他成员都用零填充。

如果您说过char buffer[100] = {1, };,该数组将包含 1 和 99 个零。

于 2013-04-22T07:53:17.160 回答
4

buffer[100] = {literal, }将第一个元素初始化为文字值,其余元素初始化为0。另一方面,将所有元素初始化为。您的代码等同于buffer[100] = {0}将所有元素初始化为 0。RichieHindle说明了整点。0buffer[100] = {0}buffer[100] = {1, }

于 2013-04-22T08:00:25.187 回答
1

给定大小的数组的初始值设定项以一对一的方式分配给数组成员。如果所有成员的初始值设定项太少,其余成员将被初始化为 0。为给定大小的数组列出太多初始值设定项是错误的。

于 2013-04-22T08:00:48.143 回答