C中结构的指定初始值设定项和复合文字

时间:2014-07-24 14:08:33

标签: c gcc struct initialization

我有以下结构:

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 };

2 个答案:

答案 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 };怎么样?

会员bc将分别初始化为30,而a默认会初始化为0。< / p>