2015-11-11 64 views
0
#include<stdio.h> 

struct std 
    { 
    char c; 
    char e; 
}; 

void main() 
    { 
    struct std p,q; 
    int start,last; 
    last= &q; 
    start= &p; 
    printf("Size:%u %u Address_Diff:%d \n",&p, &q,(last-start)); 
} 

我正在學習結構對齊和填充,而我們執行上面的程序,每次顯示16個字節的兩個結構變量之間的時差。我不明白爲什麼差異是16字節,但我期待的差異是2個字節。爲什麼在64位操作系統中,結構變量之間的差異始終是16字節?

一些例子:

4077309424 4077309440 DIFF:16

3600238672 3600238688 DIFF:16

3272011008 3272011024 DIFF:16

+1

由於填充結構的大小是16個字節(每個單字節填充了額外的7個字節)。 –

+1

@EugeneSh。這裏顯示的結構幾乎都沒有填充任何形式的形狀,其大小爲2,至少在所有常見平臺上。 – nos

回答

0

一般來說編譯器可填充字節,以保持每個結構變量開始定位爲單詞或雙字對齊。我猜測對齊位置的選擇可能是架構和編譯器的依賴。

看來你的編譯器爲每個結構變量保持16字節對齊。有時編譯器可能會將字節填充到結構的元素以保持字或雙字對齊。您可以檢查字節填充發生的位置,我的意思是字節或填充元素級別或結構級別。

打印每個元素地址(如下所示)並查看它們之間的區別。

printf("Size:%u %u Address_Diff:%d \n",&p.c, &p.e); 

如果差異僅僅是一個字節,則意味着字節在結構級別即結構的末尾被填充。

相關問題