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

zod*_*iac 4 c gcc struct initialization

我有以下结构:

typedef struct my_struct {
    int a;
    int b;
    int *c;
} my_struct;
Run Code Online (Sandbox Code Playgroud)

是:

my_struct n = (my_struct) { .b = 3 };
Run Code Online (Sandbox Code Playgroud)

相当于:

my_struct n = (my_struct) { .a = 0, .b = 3, .c = NULL };
Run Code Online (Sandbox Code Playgroud)

关于什么:

my_struct n = (my_struct) { .b = 3, 0 };
Run Code Online (Sandbox Code Playgroud)

Sha*_*our 5

它们应该被初始化,好像它们是静态的,我们可以在草案C99标准部分找到这个.6.7.8 初始化19段说(强调我的):

初始化应在初始化器列表顺序中进行,每个初始化器为特定子对象提供,覆盖任何先前列出的同一子对象的初始化器; 132)未明确初始化的所有 子对象应与具有静态存储持续时间的对象隐式初始化.

如果以下初始化程序不是指示符,那么它将在该指示符之后接收下一个字段,如第17段所述:

每个大括号括起的初始化列表都有一个关联的当前对象.当没有指定时,根据当前对象的类型按顺序初始化当前对象的子对象:增加下标顺序的数组元素,声明顺序中的结构成员,以及union的第一个命名成员.29)相反,指定使得以下初始化器开始初始化由指示符描述的子对象.然后初始化按顺序继续向前,从指定者描述的下一个子对象开始.130)

这按照段落20递归地应用于子聚合:

如果聚合或联合包含聚合或联合的元素或成员,则这些规则递归应用于子聚合或包含的联合

初始化静态持续时间对象的规则见6.7.810节:

如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态存储持续时间的对象,则:

- 如果它有指针类型,则将其初始化为空指针;

- 如果它有算术类型,则初始化为(正或无符号)零;

- 如果是聚合,则根据这些规则初始化(递归)每个成员; [...]