2012-06-20 75 views
3

可能重複:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?C結構的大小

我有這樣定義的簡單C結構:

typedef struct LMWinData { 
    UInt8 itemTypeID; 
    UInt16 serviceID; 
    UInt16 methodID; 
} LMWinData; 

在代碼後來我定義一個變量像這樣的這種類型:

LMWinData lmWinData; 

現在,如果我打印出這個變量的大小:

NSLog(@"data has size of %lu bytes", sizeof(lmWinData)); 

我沒有得到預期值(5個字節)。我得到的是6字節的大小。

那麼,這裏有什麼問題?

非常感謝!

(我正在使用Mac OS X Lion。)

回答

0

看看結構填充,對齊。有些方法可以在某些編譯器中強制對齊:

typedef struct LMWinData { 
    UInt8 itemTypeID; 
    UInt16 serviceID; 
    UInt16 methodID; 
} LMWinData __attribute__ ((aligned (1))); 
+0

非常感謝!我使用了'編譯包(1)'方法,解決了這個問題。 –

3

您在這裏看到對齊問題。在處理試圖高效地創建軟件訪問位置的編譯器時,這可能是一個棘手的問題。特別是,你有一個結構,其中兩個16位整數跟隨一個8位,導致16位整數在奇數位置開始,這通常很慢。

但是,在有必要的情況下,用於控制對齊和填充的clang/llvm方法是__attribute__((packed))

,或者對你的結構使用:

typedef struct LMWinData { 
    UInt8 itemTypeID; 
    UInt16 serviceID; 
    UInt16 methodID; 
} __attribute__((packed)) LMWinData; 

我認爲這也適用於現代GCC,以及。