2014-06-22 89 views
1

我正在寫代碼來檢查int,char和一些struct.But的大小,但是它給出的結果與手動計算出的結果不同。使用SIZEOF運算符計算出的結果不同嗎?

#include<stdio.h> 
struct person 
{ 
    int roll; 
    char name[10]; 

}; 
void main() 
{ 
    struct person p1; 
    printf("\n The size of the integer on machine is \t :: %d \n ",sizeof(int)); 
    printf("\n The size of the char on machine is \t :: %d \n ",sizeof(char)); 

    printf("\n The size of structre is \t :: %d \n",sizeof(struct person)); 
    printf("\n The size of structre is \t :: %d \n",sizeof(p1));  


} 

我覺得結構應具有尺寸= 10 * 1 + 4 = 14,但輸出

The size of the integer on machine is :: 4 

The size of the char on machine is  :: 1 

The size of structre is  :: 16 
+2

http://stackoverflow.com/tags/c/info。而10 * 1 + 4是14,順便說一句。 – mafso

+2

結構被填充 – bolov

回答

0

首先,你需要改變%d%zu因爲sizeof回報size_t類型。

sizeof(p1)給出16字節而不是14,因爲填充2字節被添加到它。

struct person 
{ 
    int roll;  // 4 bytes 
    char name[10]; // 10 bytes. 2 bytes are needed for structure alignment 

}; 
+0

爲什麼2個字節被添加爲填充? – alpha9eek

+0

對於[結構對齊](http://en.wikipedia.org/wiki/Data_structure_alignment),由於CPU處理內存的方式而增加了系統的性能。 – haccks

1

看看維基百科所說的話!

要計算任何對象類型的大小,編譯器必須考慮可能需要滿足效率或體系結構約束的任何地址對齊。許多計算機體系結構不支持從不是字長倍數的任何字節地址開始的多字節訪問,並且即使體系結構允許它,通常處理器也可以比獲取對象更快地獲取字對齊的對象跨越記憶中的多個詞。[4]因此,編譯器通常將數據結構與至少一個字對齊邊界對齊,並將各個成員對齊到它們各自的對齊邊界。在下面的例子中,結構學生很可能在單詞邊界上對齊,這也是成員成績開始的地方,並且成員年齡很可能從下一個單詞地址開始。編譯器根據需要在成員之間插入未使用的「填充」字節以完成後者,以滿足對齊要求。在結構被用作數組的元素的情況下,在結構的末端還可以存在填充以確保正確對齊。因此,C中結構的聚集大小可以大於其各個成員大小的總和。例如,在許多系統上下面的代碼將打印8:

struct student{ 
    char grade; /* char is 1 byte long */ 
    int age; /* int is 4 bytes long */ 
}; 

printf("%zu", sizeof (struct student)); 

你應該改變字符數組的大小,你的結構以更好地理解

例如嘗試:

struct person 
{ 
    int roll; 
    char name[4]; 

}; 

給出答案爲8

struct person 
{ 
    int roll; 
    char name[7]; 

}; 

給出答案爲12

+0

如果真的有幫助,你可以接受答案! ;) – Nullpointer