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

C中结构的指定初始值设定项和复合文本,c,gcc,struct,initialization,C,Gcc,Struct,Initialization,我有以下结构: typedef struct my_struct { int a; int b; int *c; } my_struct; 是: 相当于: my_struct n = (my_struct) { .a = 0, .b = 3, .c = NULL }; 那么: my_struct n = (my_struct) { .b = 3, 0 }; 应将其初始化为静态,我们可以在C99标准草案第6.7.8节中找到这一点,初始化第19段说(重点): 初始化应按

我有以下结构:

typedef struct my_struct {
    int a;
    int b;
    int *c;
} my_struct;
是:

相当于:

my_struct n = (my_struct) { .a = 0, .b = 3, .c = NULL };
那么:

my_struct n = (my_struct) { .b = 3, 0 };

应将其初始化为静态,我们可以在C99标准草案第6.7.8节中找到这一点,初始化第19段说(重点):

初始化应按初始化器列表顺序进行,每个 为覆盖任何子对象的特定子对象提供的初始值设定项 以前列出的同一子对象的初始值设定项;132)全部 未显式初始化的子对象应初始化 隐式地与具有静态存储持续时间的对象相同。

如果以下初始值设定项不是一个指示符,则它将与该指示符后面的下一个字段一起拾取,这将在第17段中介绍:

每个括号内的初始值设定项列表都有一个关联的当前对象。 当不存在指定时,将显示当前对象的子对象 根据当前对象的类型按顺序初始化: 按递增下标顺序排列的数组元素,按递增下标顺序排列的结构成员 声明顺序,以及联盟的第一个命名成员。129) 相反,指定会导致以下初始值设定项开始 由指示器描述的子对象的初始化。 然后,初始化继续按顺序进行,从 指示器描述的子对象之后的下一个子对象。130)

根据第20段,这一点递归适用于子骨料:

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

初始化静态持续时间对象的规则见章节
6.7.8
第10段:

如果未初始化具有自动存储持续时间的对象 显然,它的值是不确定的。如果对象具有静态 未明确初始化存储持续时间,则:

-如果有指针类型,则初始化为空指针

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

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

Is
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

简单的方法是编译它并亲自查看。未初始化的成员初始化为零(或指针为空)@Ben不幸的是,有很多编译器扩展,所以尝试它可能只会告诉你它是否在你的编译器上工作,可能不会告诉你你是否调用了未定义的行为等等……好吧,这很公平,我刚刚记得读过这篇文章,并且非常确定它是标准的一部分(根据你的回答)我是对的,那是不必要的值吗(例如:{.b=3,0,5,7})将被拒绝?@zodiac;您的编译器应该对此发出警告。谢谢!是(键入_name){…}一个新对象(并且它将被复制)还是语言构造?@zodiac请参阅我关于复合文字的答案。如果它在函数中,它是本地(自动)对象,否则是静态的。
my_struct n = (my_struct) { .b = 3, 0 };