2012-03-14 105 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?