在如下代码中,我们通常在结构的末尾有一个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语言规范是否说明了聚合初始化对隐式填充的作用?
答案 0 :(得分:2)
引用C99标准“类型表示”,6.2.6:
当一个值存储在一个对象中时 结构或联合类型,包括in 一个成员对象,的字节 对应的对象表示 任何填充字节都未指定 值。
简而言之,语言并未指明;这取决于C编译器/接口实现者。
答案 1 :(得分:0)
我有理由相信没有关于填充初始化的要求。例如,一个实现向每个结构添加填充是完全合法的,并让它存储一个标记,告诉它支持运行时类型检查的结构类型。在这种情况下,大多数结构都包含始终为非零的填充。