2017-10-09 93 views
0

晚上好!具有不均匀8位成员的结构体的大小不均匀

'有以下问题:我有一个多字节和单字节数据类型的输入流,只是想把它放在结构上。不幸的是,如果我将一个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位构件的确切顺序解析strea m到预定义的结构中。有没有办法强制这个?在一台64位机器上工作,试图用-m32 gcc标志编译。

我知道它与结构等填充有关。但是有没有解决方法仍然可以实现固定的结构尺寸?

在此先感谢!

+1

我认为你正在寻找“结构填充”和“对齐”这两个字。这可能会帮助你找到你要找的东西。 – templatetypedef

+0

[为什么不是一个结构的sizeof等于每个成员的sizeof总和?](https://stackoverflow.com/q/119123/995714) –

+0

只需编写代码即可完成您所需的任务。如果你关心结构的大小,你做错了什么。 –

回答

0

如果使用packed属性,则结构不包含填充。

struct __attribute__((packed)) uuu { // will now contain 5 bytes 
+1

对,因为:该语言不能保证。作者想要的不是可移植的C.但是在这种情况下,编译器愿意帮他一个忙。 – Tommy

+0

重新“*作者想要的不是可移植的C *”,此外,有些机器实际上并不能访问某些类型,除非它们被正确对齐。 – ikegami

+0

这将导致您的访问未对齐,这可能会导致您的代码崩溃或以其他方式做错事。 –