为什么这个结构体12的大小不是10?
可能重复:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?为什么这个结构体12的大小不是10?
我试图解析ID3v2标签,至少得到这样的艺术家,标题和专辑的重要数据,但我无法设置必要的结构。
struct ID3v2_frame{
char id[4];
unsigned int size;
bool flags[2];
};
ID3v2_frame frame;
cout<<sizeof(frame)<<endl;
这是一个问题,我如何设置一个4字节的int我认为。 当我输出sizeof(帧)它输出12,我的预期输出是10. 我在64位的Linux机器上运行。
我的猜测是标记和id数组中的终止字符。
终止符是什么? – 2012-03-14 05:20:03
我似乎记得在我的数据结构类中,当您在数组中声明时,编译器总是在末尾抛出一个/ n,以让编译器知道该字符串已完成。所以id看起来像 'id = [],[],[],[],/ n',但我也可以离开基地。 – joebro 2012-03-14 14:52:14
请主程序检查:
sizeof(bool) //should return 2 my guess
sizeof(char) //should return 1
sizeof(unsigned int) //should return 4
每一个编译器可以对数据类型不同的大小。
注意,在x64布尔大小为2个字节
这是因为结构包装。编译器会使结构的大小成为4个字节的倍数。如果你不希望这种情况发生,看看大小,在您的案件10个字节,使用__attribute__((packed))
struct ID3v2_frame{
char id[4];
unsigned int size;
bool flags[2];
}__attribute__((packed));
注意,这可能会影响程序的性能。看到这个太问题:
Can __attribute__((packed)) affect the performance of a program?
'bool'是不是C型。它是如何定义的? – leppie 2012-03-14 05:16:21
是的,它是非常多的,没有在我的搜索中遇到它,虽然得到了答案,谢谢 – carboncomputed 2012-03-14 05:23:22
@leppie:'bool'不是在C89中的标准类型,但它是在C99后'#include' (并且'_Bool'在任何时候都是C99中的一个类型)。 –
2012-03-18 21:22:10