2013-12-12 44 views
0

結構的sizeof我對整個「數據對齊」的東西很困惑:與工會

#include <stdio.h> 
int main(){ 
    struct st{ 
     int i,*p; 
     char c; 
     union { char type[4]; unsigned char d;} un; 
    }; 

    struct st s1={25,&a,'X',"asdf"}; 
    printf("sizeof s1 is %d",sizeof(s1)); 
    return 0; 
} 

由於數據比對,我想,既然的

int i : 4 bytes 
int *p : 8 bytes 
char c : 1 byte(+3) 
union : 4 bytes 

輸出將大小是20,但是這輸出sizeof s1 is 24! 爲什麼輸出24?這是否是int * p,即8個字節?

+2

'sizeof'''''''(分配多少內存)不一定是它的部分大小的總和。編譯器可能會填充它的一部分(比你指出的更重要)。或者它可以將其舍入到8的倍數。例如,參見http://stackoverflow.com/questions/119123/why-isnt-sizeof-for-a-struct-equal-to-the-sum-of- sizeof-of-member – lurker

+0

給出下面的答案,你應該首先聲明'p',或者檢查你的編譯器是否有相關的'#pragma's。 –

+0

@EricJablow:如果你先把'p'放在首位,大小仍然是24.你可以自己檢查一下。 –

回答

0

在您的系統上,指針是8個字節並對齊到8個字節。

 
    1 2 3 4 5 6 7 8 
+---+---+---+---+---+---+---+---+ 
| int i   | [pad]   | 
+---+---+---+---+---+---+---+---+ 

    9 10 11 12 13 14 15 16 
+---+---+---+---+---+---+---+---+ 
| int *p      | 
+---+---+---+---+---+---+---+---+ 

17 18 19 20 21 22 23 24 
+---+---+---+---+---+---+---+---+ 
| c | un   | [pad]  | 
+---+---+---+---+---+---+---+---+ 

當然,在不知道ABI的情況下,您無法確定確切的佈局。以上只是一個例子。

0

在您使用的架構上,int *p是8個字節,但也需要在8個字節的邊界上。這給了你在ip之間的4個字節的填充。此外,因爲int *p需要位於8字節的邊界上,所以總體結構需要爲8個字節的倍數,以便它們的數組始終具有p的正確對齊方式。

所以,你結束了這樣的佈局:

  • i:4個字節,對準4
  • 墊:4個字節
  • p:8字節,對準8
  • c: 1字節
  • un:4字節(因爲它可以保持字節對齊)
  • pad:3字節(將其舍入到一個8字節的邊界)
+0

因此,在所有結構中,尺寸總是大到最大的尺寸? – lessofaprogrammer

+0

這取決於很多事情。 –

+0

@ user3093640:在我所使用的體系結構中,通常struct的對齊方式與struct中限制最嚴格的成員的對齊方式相匹配。不過,這是實現定義的。長度和對齊要求並不總是匹配:例如,在32位x86上,「long long」類型是8個字節,但僅具有4個字節的對齊要求。 –