当使用新的结构初始化格式时,未列出的成员是否具有未指定的值?



我需要准备一个大的结构体:

struct Config {
    int a;
    int b;
    int c;
    struct { int x; int y; } d[40];
};

我想这样填充:

Config config = {
    .a = 3;
    .b = 4;
    .d[0] = {10, 12};
    .d[1] = {14, 16};
};

之后,config.cconfig.d[2]的值是否有未指定的值?还是零?

或者,我需要做:

Config config;
memset(&config, 0, sizeof(config));
config.a = 3;
config.b = 4;
config.d[0].x = 10;
config.d[0].y = 12;
...

初始化为0

来自C99标准,§6.7.8,第19项:

初始化应该按照初始化项列表顺序进行,为特定子对象提供的每个初始化项覆盖先前列出的同一子对象的初始化项;所有未显式初始化的子对象应隐式初始化,与具有静态存储持续时间的对象相同。

static对象初始化的规则在前面的第10项中指定:

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

  • 如果是指针类型,则初始化为空指针;
  • 如果是算术类型,则初始化为(正数或无符号)零;
  • 如果是聚合,则每个成员都根据这些规则初始化(递归);
  • 如果是联合,则第一个命名成员将根据这些初始化(递归地)规则。

相关内容

最新更新