2017-04-14 87 views
-1
union u 
{ 
    int a; 
    float b; 
    char c[10]; 
}; 
int main() 
{ 
    union u abc; 
    printf("\n%d",sizeof(abc)); 
} 

輸出:12 我希望可以將輸出爲10.sizeof(焦炭)爲1。因此,對於10我希望它是10.一個人能解釋我爲什麼我們得到12.的sizeof字符數組不正確打印

+2

有填充。 – jxh

+2

標題:'sizeof char array',(char c [10])。代碼:'sizeof(abc)',(工會)。爲什麼要聲稱一件事,然後證明另一件事 – ThingyWotsit

+1

你問關於數組(標題)的大小還是聯合(代碼)的大小? – chux

回答

2

這是因爲可能至少有一個floatint數據類型有4個字節的對齊要求。所以struct得到2個字節的填充(所以sizeof(struct u) % 4 == 0)。

如果您的編譯器支持它們以避免填充,您可以使用__attribute__((packed))或類似的功能,但除非預先存在符合的數據,否則不方便。考慮一下包裝struct u元素的數組將具有未對齊的成員的事實。

+0

「這是因爲float(和int)具有4個字節的對齊要求。 - >可能只是其中的一個具有16位'int'的需求。 – chux

+1

@chux:是的,在大多數非嵌入式平臺上,它們大都是4字節,在真正依賴的嵌入式平臺上。我不確定半精度浮動,肯定用於計算機圖形學,但沒有線索嵌入式架構可以使用它作爲'浮動'的直接替代。 – Jack