2016-10-01 94 views
5

下面的代碼中的結構的大小是什麼?任何人都可以請告訴我如何來下面顯示的結構的大小是24和不20.假設我們的結構填充和int的大小是4並且double的大小是8個字節

typedef struct 
{ 
    double d; // this would be 8 bytes 
    char c; // This should be 4 bytes considering 3 bytes padding 
    int a; // This would be 4 bytes 
    float b; // This would be 4 bytes 
} abc_t; 

main() 
{ 
    abc_t temp; 
    printf("The size of struct is %d\n",sizeof(temp)); 
} 

我asumption是結構的大小是20,當我們考慮的填充,但是當我運行這段代碼的大小被打印成24

+0

'sizeof(char)== 1',always。不是'4'。填充和對齊不會影響成員的大小。 – Dai

+1

@Dai因此'3字節填充'註釋。 –

+0

是的,它是1個字節,但包括3個字節的填充。 – user2520451

回答

6

大小會24。這是因爲最後一個成員填充了所需的字節數,因此結構的總大小應該是任何結構成員的最大對齊的倍數。

所以填充會像

typedef struct 
{ 
    double d; // This would be 8 bytes 
    char c; // This should be 4 bytes considering 3 bytes padding 
    int a;  // This would be 4 bytes 
    float b; // Last member of structure. Largest alignment is 8. 
       // This would be 8 bytes to make the size multiple of 8 
} abc_t; 

閱讀wiki文章以瞭解詳情。

+0

非常感謝。我可以向你發佈另一個簡單的問題嗎? – user2520451

+0

@ user2520451;嗯....拍攝 – haccks

+0

函數指針int(* fp)(int,int)。當我打印fp的大小時,它給出了8,我認爲任何函數指針或結構指針在32位機器上都是4。 – user2520451

-1

也許packed屬性會回答問題。

typedef struct 
{ 
    double d; // this would be 8 bytes 
    char c; // This should be 4 bytes considering 3 bytes padding 
    int a; // This would be 4 bytes 
    float b; // This would be 4 bytes 
} __attribute__((packed)) abc_t ; 
+0

不,它沒有正確回答問題。嘗試一下:你的體型現在是20,就像OP期待的那樣? – usr2564301

+0

所以我給了你這個懷疑的好處並且嘗試過。結果:'sizeof abc_t是17',*對於'packed'是正確的,但不是OP預期的'20'。 – usr2564301

相關問題