在一个结构中,我们通常有一个连续的位字段;也就是说,一个接一个,彼此相邻,例如:
struct demo
{
char a;
char b:1;
char c:2;
char d:2;
int e;
} demo1;
demo1
的大小为8个字节:
a
(1字节)+位字段(1字节)+间隙(2字节)+ e
(4字节))现在考虑以下结构:
struct demo
{
char a;
int b:1;
char c;
char d;
int e:2;
} demo1;
当我使用sizeof(demo1)
时,它给了我8个字节,但我想知道这些位字段是如何在内存中显示的。
如果计算与上述结构尺寸相同,则应为:
a
(1字节)+ b
(4字节)+ c
(1字节)+ d
(1字节)+ e
(4字节)在编程过程中,我们不用担心如何使用sizeof
计算大小,甚至不会在两个不同的位置使用位字段,但有时面试官会问这种类型的问题。
发布于 2015-07-14 00:11:56
连续(非零宽度)位字段可以合并到单个内存位置,而位字段后面的非位字段是不同的内存位置。
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屏蔽所在的单元具有按声明顺序增加的地址。
https://stackoverflow.com/questions/31400160
复制相似问题