聚合初始化器与隐式结构填充

时间:2010-07-22 18:16:29

标签: c

在如下代码中,我们通常在结构的末尾有一个2字节的隐式填充:

struct foo {
  int32_t x ;
  int16_t y ;
// <<< 2 bytes for total sizeof(foo) == 8
} ;

今天我被问到聚合初始化程序对额外的两个字节做了什么:

foo o = { 0, 0 } ;

ie:这是否等同于

foo o ;
memset( &o, 0, sizeof(foo) ) ;

我没有任何线索,所以我建议不要依赖它(无论如何总体初学者很麻烦,所以IMO总体建议很好。)

当平台ABI要求对特定结构进行填充时,是否有人知道C语言规范是否说明了聚合初始化对隐式填充的作用?

2 个答案:

答案 0 :(得分:2)

引用C99标准“类型表示”,6.2.6:

  

当一个值存储在一个对象中时   结构或联合类型,包括in   一个成员对象,的字节   对应的对象表示   任何填充字节都未指定   值。

简而言之,语言并未指明;这取决于C编译器/接口实现者。

答案 1 :(得分:0)

我有理由相信没有关于填充初始化的要求。例如,一个实现向每个结构添加填充是完全合法的,并让它存储一个标记,告诉它支持运行时类型检查的结构类型。在这种情况下,大多数结构都包含始终为非零的填充。