在以下2个结构中,
typedef struct _a {
short a1:13 __attribute__((packed));
char a2[4] __attribute__((packed));
} a;
typedef struct _b {
short b1:10 __attribute__((packed));
short b2:10 __attribute__((packed));
short b3:12 __attribute__((packed));
} b;
在struct b
中,我发现b2的位用b1打包,而b3的位用b2打包。它最终导致4字节值。
我期待与struct a
类似的行为,但我看不出相同的行为。前2个字节占用a1(未使用的5位),后跟4个字节占用a2。
预计会出现这种情况吗?为什么我不能将char [4]与短片一起包装:13?有没有办法实现它?
答案 0 :(得分:8)
a2
不是位字段,因此永远不会与a1
放在一起。标准说
存储在任何其他对象类型的非位字段对象中的值 由n×CHAR_BIT位组成,其中n是其对象的大小 type,以字节为单位。该值可以复制到类型的对象中 unsigned char [n](例如,通过memcpy);得到的字节集是 称为值的对象表示。
所以这样的子对象必须是一个可寻址的单元,并且该规则没有例外。
答案 1 :(得分:1)
(评论太久了,所以我把它作为答案)
要将所有字段打包在一起,必须用4个字段替换数组:
typedef struct _a {
short a1:13 __attribute__((packed));
char a2_0:8 __attribute__((packed));
char a2_1:8 __attribute__((packed));
char a2_2:8 __attribute__((packed));
char a2_3:8 __attribute__((packed));
} a;