【发布时间】:2017-10-09 10:38:05
【问题描述】:
晚上好!
'遇到以下问题:我有一个多字节和单字节数据类型的输入流,只想将它放在一个结构上。不幸的是,如果我将不均匀数量的 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 标志进行编译。
我知道这与结构的填充等有关。但是是否有解决方法仍然可以实现固定的结构大小?
提前致谢!
【问题讨论】:
-
我认为您正在寻找“结构填充”和“对齐”这两个词。这可能会帮助您找到所需的内容。
-
只需编写代码即可完成您需要的工作。如果你关心结构的大小,那你就做错了。
-
@DavidSchwartz 传入流的结构是预定义的,不是很小,所以使用这种方法比较容易。
-
@TeStUn.De 它被预定义为始终匹配您的编译器碰巧喜欢用作布局或表示的任何内容?而且您只关心完全支持非对齐访问的平台?