2013-05-18 175 views
1

我在動態內存分配方面遇到了麻煩。 不知何故,我的結構的實際大小(所有部分的總和)小於類型本身的大小。下面是代碼:類型和內存分配的大小

#include <stdio.h> 
#include <malloc.h> 

struct Lol { 
    int a; 
    char b; 

    char s[20]; 
}; 

void main() { 

    Lol* lol = (Lol*)malloc(sizeof(Lol)); 

    printf("Type size: %d bytes\n", sizeof(Lol)); 
    printf("Actual struct size: %d bytes\n", sizeof(lol -> a) + sizeof(lol -> b) + sizeof(lol -> s)); 

} 

在這種情況下結構大小應爲25個字節(4個字節整型,對於char 1個字節和20個字節用於字符數組),但的sizeof(LOL)示出箱28由於某種原因因爲char類型將被視爲int類型。這是怎麼回事?這是否意味着我失去了3個字節?

回答

1
我的結構的

實際大小(所有部件的總和)小於類型本身」的大小

因爲當值,他們就在某些內存對齊工作很多計算機操作更快C語言標準允許實現進行這種對齊,在大多數系統中,int將根據int的大小在4或8字節的邊界上對齊,結構的大小必須對齊,以便地址數組中的下一個結構的數據將正確對齊,因此以int開頭的結構與4字節邊界對齊的結構必須具有4的倍數的大小。

這是否意味着我失去了3個字節?

是的。 (呃,這並不完全沒有,你的程序通常會因爲它而更快)。現代化的機器支持2TB的RAM,這比以前更不用擔心了。