2012-03-14 79 views
0

可能重复:
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机器上运行。

+2

'bool'是不是C型。它是如何定义的? – leppie 2012-03-14 05:16:21

+0

是的,它是非常多的,没有在我的搜索中遇到它,虽然得到了答案,谢谢 – carboncomputed 2012-03-14 05:23:22

+1

@leppie:'bool'不是在C89中的标准类型,但它是在C99后'#include ' (并且'_Bool'在任何时候都是C99中的一个类型)。 – 2012-03-18 21:22:10

回答

-1

我的猜测是标记和id数组中的终止字符。

+0

终止符是什么? – 2012-03-14 05:20:03

+0

我似乎记得在我的数据结构类中,当您在数组中声明时,编译器总是在末尾抛出一个/ n,以让编译器知道该字符串已完成。所以id看起来像 'id = [],[],[],[],/ n',但我也可以离开基地。 – joebro 2012-03-14 14:52:14

1

请主程序检查:

sizeof(bool) //should return 2 my guess 
sizeof(char) //should return 1 
sizeof(unsigned int) //should return 4 

每一个编译器可以对数据类型不同的大小。

0

注意,在x64布尔大小为2个字节

0

您可能会发现从herehere你的答案。

请检查包装?默认包装(8)

0

这是因为结构包装。编译器会使结构的大小成为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?

相关问题