首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚合初始化器与隐式结构填充

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

Stack Overflow用户
提问于 2010-07-23 02:16:29
回答 2查看 663关注 0票数 1

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

代码语言:javascript
复制
struct foo {
  int32_t x ;
  int16_t y ;
// <<< 2 bytes for total sizeof(foo) == 8
} ;

今天有人问我,聚合初始化器如何处理额外的两个字节:

代码语言:javascript
复制
foo o = { 0, 0 } ;

ie:这是不是相当于

代码语言:javascript
复制
foo o ;
memset( &o, 0, sizeof(foo) ) ;

我不知道,所以我建议不要依赖它(聚合缩写器无论如何都很麻烦,所以这是一个很好的通用建议)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-23 02:27:45

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

当值存储在结构或联合类型的对象(包括成员对象)中时,与任何填充字节相对应的对象表示的字节将采用未指定的值。

简而言之,它不是由语言指定的;它取决于C编译器/接口实现者。

票数 2
EN

Stack Overflow用户

发布于 2010-07-23 02:22:06

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3311993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档