首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C结构中两个不同位置的位字段

C结构中两个不同位置的位字段
EN

Stack Overflow用户
提问于 2015-07-14 07:20:21
回答 1查看 690关注 0票数 0

在一个结构中,我们通常有一个连续的位字段;也就是说,一个接一个,彼此相邻,例如:

代码语言:javascript
代码运行次数:0
运行
复制
struct demo
{
  char a;
  char b:1;
  char c:2;
  char d:2;
  int  e;  
} demo1;

demo1的大小为8个字节:

  • size = a(1字节)+位字段(1字节)+间隙(2字节)+ e(4字节))

现在考虑以下结构:

代码语言:javascript
代码运行次数:0
运行
复制
struct demo
{
  char a;
  int  b:1;
  char c;
  char d;
  int  e:2;
} demo1;

当我使用sizeof(demo1)时,它给了我8个字节,但我想知道这些位字段是如何在内存中显示的。

如果计算与上述结构尺寸相同,则应为:

  • size = a(1字节)+ b(4字节)+ c(1字节)+ d(1字节)+ e(4字节)

在编程过程中,我们不用担心如何使用sizeof计算大小,甚至不会在两个不同的位置使用位字段,但有时面试官会问这种类型的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-14 08:11:56

连续(非零宽度)位字段可以合并到单个内存位置,而位字段后面的非位字段是不同的内存位置。

代码语言:javascript
代码运行次数:0
运行
复制
 struct demo
 {
      char a;
      int b:1;
      char c;
      char d;
      int  e:2;
 } demo1;

所以在这个struct中,有一个非比特字段和一个比特字段,然后是两个非比特字段,最后是一个比特字段。

在位字段成员之后有一个非位字段(或零长度位字段),接下来将是一个不同的/独立的内存位置/对象。

还包括:

编译器不会重新排序struct的元素,因为这违反了C标准。C99标准第6.7.2.1节规定:

在一个结构对象中,非位field成员和位-fi屏蔽所在的单元具有按声明顺序增加的地址。

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

https://stackoverflow.com/questions/31400160

复制
相关文章

相似问题

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