我有以下结构:
typedef struct my_struct {
int a;
int b;
int *c;
} my_struct;
是:
my_struct n = (my_struct) { .b = 3 };
相当于:
my_struct n = (my_struct) { .a = 0, .b = 3, .c = NULL };
怎么样:
my_struct n = (my_struct) { .b = 3, 0 };
答案 0 :(得分:5)
它们应该被初始化,好像它们是静态的一样,我们可以在草案C99标准部分找到这个6.7.8
初始化段 19 说(强调我的):
初始化应在初始化程序列表顺序中进行 初始化程序为特定的子对象提供覆盖任何子对象 以前列出的同一子对象的初始值设定项; 132)全部 未明确初始化的子对象应初始化 隐式与具有静态存储持续时间的对象相同。
如果以下初始化程序不是指示符,那么它将在该指示符之后接收下一个字段,这将在段落 17 中涵盖:
每个大括号括起的初始化列表都有一个关联的当前对象。 当没有指定时,当前对象的子对象是 根据当前对象的类型按顺序初始化: 数组元素增加下标顺序,结构成员在 声明顺序,以及union的第一个指定成员.29)In 相反,指定会导致以下初始化程序开始 初始化由指示符描述的子对象。 然后初始化按顺序继续向前,从 在指定者描述之后的下一个子对象.130)
根据段落 20 递归地应用于子聚合:
如果聚合或联合包含元素或成员 聚合或联合,这些规则递归地应用于 分包或包含工会
初始化静态持续时间对象的规则可在6.7.8
段 10 中找到:
如果未初始化具有自动存储持续时间的对象 显然,它的价值是不确定的。如果一个对象有静态 存储持续时间未明确初始化,然后:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员; [...]
答案 1 :(得分:2)
my_struct n = (my_struct) { .b = 3 };
是否等同于my_struct n = (my_struct) { .a = 0, .b = 3, .c = NULL };
?
是。复合文字可能无法提供完全初始化,在这种情况下,任何未初始化的成员默认情况下初始化为零(NULL
是指针成员的情况)。
my_struct n = (my_struct) { .b = 3, 0 };
怎么样?
会员b
和c
将分别初始化为3
和0
,而a
默认会初始化为0
。< / p>