2010-06-18 120 views
0

在下面的一段代碼,的sizeof(結構)混淆

#include<stdio.h> 
typedef struct { 
    int bit1:1; 
    int bit3:4; 
    int bit4:4; 
} node; 

int main(){ 
    node n,n1,n2,ff[10]; 

    printf("%d\n",sizeof(node)); 
    return 0; 
} 

如何預測結構的大小?

+5

爲什麼你認爲你應該能夠準確地預測它? – 2010-06-18 18:12:43

+0

你爲什麼想要? – 2010-06-18 18:22:09

回答

9

如果不知道編譯器和編譯的目標平臺,就無法預測它。

0

通常,每個編譯器都會決定如何打包聯合,因此無法對最終大小做出很多假設。他們可以根據參數決定不同的佈局。

3

這取決於平臺和編譯器設置(包裝,定位,32/64機)

根據comp.lang.c FAQ list

「位字段被認爲是不可移植的,雖然他們都毫不遜色便攜比語言的其他部分。「

+1

奇怪的引用是什麼...... – jalf 2010-06-19 03:07:19

1

你會發現你的結構的大小根據編譯器優化設置而改變。我預測這個結構在2到12個字節之間。

即使使用像你這樣的位域,你也不能總是預測結構的大小是什麼。編譯器可能會讓每個位字段佔用int的全部空間,或者可能只是您指定的1或4位。使用位字段雖然在內存存儲空間上很好,但對於運行時間和可執行文件大小通常不利。

+0

我不確定編譯器將這個結構佔用小於int的大小是否合法。它肯定不能佔用小於char的大小,因爲sizeof(...)必須返回一個整數。 – Stewart 2010-06-18 18:22:12

+0

@Stewart:有'sizeof(int)== 2'的平臺。 – 2010-06-18 18:29:19

+0

@Stephen:我不認爲我說沒有。也有平臺,它不是八位數的倍數,我的答案中也沒有任何東西不允許這樣做。答案表明編譯器可能只將結構打包爲4位,這就是我所說的不可能發生的情況,特別是因爲int必須至少爲16位。 – Stewart 2010-06-18 18:44:16

3

一般來說是不可預測的,但實際上它會經常出現sizeof(int)。其本身往往是4;不常見2,有時8。

大多數情況下位字段將被打包,大多數情況下int類型將有9位或更多位的存儲空間。

+1

int總是至少爲16位,標準是這樣說的(long總是至少爲32,而在C99中我們得到的long long至少是64,並且它們都可以大於這些大小) – Spudd86 2010-06-19 01:01:35

0

添加位字段大小,除以8 * sizeof(int),並取該值的上限。在你的例子中,它會是4.

+0

沒有底層邏輯無論如何... – SurDin 2010-06-18 22:53:15

+0

@SurDin假設是編譯器將這些字段緊緊包裝並使用sizeof(int)大小的塊。 – Spudd86 2010-06-19 00:57:18