具有不均匀 8 位成员的结构大小不均匀
Size-of struct with uneven 8bit members is not uneven
晚上好!
'遇到以下问题:我有一个多字节和单字节数据类型的输入流,只想将它放在一个结构上。不幸的是,如果我将不均匀数量的 8 位成员与 16 位成员放在一个结构中,sizeof()
函数将给我一个偶数长度的舍入。
以下示例:
数据类型:
struct uuu { // should contain 5 bytes
uint8_t a[1];
uint8_t b[1];
uint16_t c;
char d[1];
};
struct ccc { // should contain 5 bytes
char a;
char b;
char c;
uint16_t d;
};
struct bbb { // should contain 3 bytes
char a;
char b;
char c;
};
片段:
printf("char_bit: %d\n", CHAR_BIT);
printf("%d | %d | %d", sizeof(uuu), sizeof(ccc), sizeof(bbb));
结果:
char_bit: 8
6 | 6 | 3
重点是,我需要 8 位成员的精确顺序来将流解析为预定义的结构。有没有办法强制执行此操作?在 64 位机器上工作,已经尝试使用 -m32
gcc 标志进行编译。
我知道它与结构的填充等有关。但是是否有解决方法仍然可以实现固定的结构大小?
提前致谢!
如果您使用 packed
属性,您的结构将不包含填充。
struct __attribute__((packed)) uuu { // will now contain 5 bytes
晚上好!
'遇到以下问题:我有一个多字节和单字节数据类型的输入流,只想将它放在一个结构上。不幸的是,如果我将不均匀数量的 8 位成员与 16 位成员放在一个结构中,sizeof()
函数将给我一个偶数长度的舍入。
以下示例:
数据类型:
struct uuu { // should contain 5 bytes
uint8_t a[1];
uint8_t b[1];
uint16_t c;
char d[1];
};
struct ccc { // should contain 5 bytes
char a;
char b;
char c;
uint16_t d;
};
struct bbb { // should contain 3 bytes
char a;
char b;
char c;
};
片段:
printf("char_bit: %d\n", CHAR_BIT);
printf("%d | %d | %d", sizeof(uuu), sizeof(ccc), sizeof(bbb));
结果:
char_bit: 8
6 | 6 | 3
重点是,我需要 8 位成员的精确顺序来将流解析为预定义的结构。有没有办法强制执行此操作?在 64 位机器上工作,已经尝试使用 -m32
gcc 标志进行编译。
我知道它与结构的填充等有关。但是是否有解决方法仍然可以实现固定的结构大小?
提前致谢!
如果您使用 packed
属性,您的结构将不包含填充。
struct __attribute__((packed)) uuu { // will now contain 5 bytes