C中结构数组的部分初始化
在复习 C 知识时,我偶然发现了以下示例:
#include <stdio.h>
/* Just a simple structure */
typedef struct lab {
int num;
char *str;
} bal;
int main (void) {
/* Declare and _partially_ initialize an array of the structure above... */
bal struct_array[10] = { {0, NULL} };
/* Question: what does _exacly_ happen to the other 9 members of the array? */
return 0;
};
代码中的注释应该足以提供我的问题。换句话说,如果我们部分初始化一个结构体数组会发生什么?当然,我知道(至少)对于 C++11 有默认的初始化。但它也适用于纯 C 吗?如果是,是否适用于所有标准(从 C89 开始),还是仅适用于某些特定标准?谢谢你。
回答
如果数组或结构仅部分初始化,则任何没有显式初始化程序的包含对象都将设置为 0 或 NULL。
C11 标准的第 6.7.9p21 节介绍了部分初始化:
如果花括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应隐式初始化与具有静态存储持续时间的对象相同。
6.7.9p10 节介绍了具有静态存储持续时间的对象的初始化:
如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果没有显式初始化具有静态或线程存储持续时间的对象,则:
- 如果是指针类型,则初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则(递归地)初始化每个成员,并将任何填充初始化为零位;
- 如果是联合,则根据这些规则(递归地)初始化第一个命名成员,并将任何填充初始化为零位
因此,在您的特定情况下,所有数组元素都将num成员设置为 0,将str成员设置为 NULL。