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

时间:2014-07-11 20:34:58

标签: c

所以我需要准备一个大型结构:

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

1 个答案:

答案 0 :(得分:5)

它们被初始化为零。

根据C99标准,§6.7.8,第19项:

  

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

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

  

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

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