在以下两个结构中,

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]和short:13一起打包呢?有办法实现吗?

最佳答案

(时间太长,无法发表评论,因此我将其作为回答)
若要将所有字段打包在一起,必须将数组替换为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;

10-08 17:35