C语言中,使用buffer[100] = {0, }进行初始化的工作原理是什么?

8
在用C语言编写程序的数据加载部分,我看到缓冲区的初始化是这样完成的:
char buffer[100] = {0, };

但是我不确定这个语句分配了什么值,请分享一些想法。

这取决于编译器还是语言特性吗?

如果这个语句等价于以下语句,那么使用那个零后面的逗号有什么意义呢?

char buffer[100] = {0};

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


3
你不能只检查每个元素的值吗? - Kiril Kirov
5
哦,我真傻。但是如果这取决于编译器或其他什么因素呢? - George
好的,在Xcode IDE,Apple LLVM编译器 4.2下,从buffer[0]到buffer[255]所有元素都是 '\0'。 - George
2
一个非常相关的问题:如何在C语言中初始化数组? - Bo Persson
4个回答

12
这取决于编译器还是语言特性吗?该行为由语言标准指定。当前标准(C11 §6.7.9 Initialization / 21,第141页)描述了在提供比聚合体元素或成员更少的初始化程序时会发生什么:如果花括号括起来的列表中有比聚合体中的元素或成员更少的初始化程序,或者用于初始化已知大小的数组的字符串字面量中的字符比数组中的元素更少,则聚合体的其余部分应隐式初始化为具有静态存储期的对象一样。因此,未指定的元素将被初始化为\0

啊!在C11第6.7.9节初始化的前面,语法明确支持{0,}格式作为{initializer-list,} - George

6
给定的值(在本例中是单个0)将被使用,然后所有其他成员都将填充为零。
如果您输入了char buffer[100] = {1, };,则该数组将包含一个1和99个零。

4

buffer[100] = {literal, }将数组的第一个元素初始化为字面值,其余元素初始化为0。而buffer[100] = {0}会将所有元素都初始化为0。你的代码等同于buffer[100] = {0},因为它们都将所有元素初始化为0。RichieHindle的buffer[100] = {1, }阐述了整个问题所在。


1

给定大小的数组的初始化器按一对一的方式分配给数组成员。如果初始化器数量不足以初始化所有成员,则剩余成员将被初始化为0。对于给定大小的数组,列出太多的初始化器是一个错误。


感谢您分享您的见解,evilruff。 - George

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接