struct stu3
{
char c1;
int i;
char c2;
}
struct stu4
{
char c1;
char c2;
int i;
}
雖然結構體stu3和stu4中成員都一樣,但sizeof(struct stu3)的值為12而sizeof(struct stu4)的值為8。 sizeof計算嵌套的結構體大小 對於嵌套的結構體,需要將其展開。對結構體求sizeof時,上述兩種原則變為: (1)展開後的結構體的第一個成員的偏移量應當是被展開的結構體中最大的成員的整數倍。 (2)結構體大小必須是所有成員大小的整數倍,這裡所有成員計算的是展開後的成員,而不是將嵌套的結構體當做一個整體。 看下面的例子:
struct stu5
{
short i;
struct
{
char c;
int j;
} ss;
int k;
}
結構體stu5的成員ss.c的偏移量應該是4,而不是2。整個結構體大小應該是16。 下述代碼測試原則2:
struct stu5
{
char i;
struct
{
char c;
int j;
} ss;
char a;
char b;
char d;
char e;
char f;
}
結構體ss單獨計算占用空間為8,而stu5的sizeof則是20,不是8的整數倍,這說明在計算sizeof(stu5)時,將嵌套的結構體ss展開了,這樣stu5中最大的成員為ss.j,占用4個字節,20為4的整數倍。如果將ss當做一個整體,結果應該是24了。 另一個特殊的例子是結構體中包含數組,其sizeof應當和處理嵌套結構體一樣,將其展開,如下例子:
struct ss
{
float f;
char p;
int adf[3];
};
其值為20。float占4個字節,到char p時偏移量為4,p占一個字節,到int adf[3]時偏移量為5,擴展為int的整數倍,而非int adf[3]的整數倍,這樣偏移量變為8,而不是12。結果是8+12=20,是最大成員float或int的大小的整數倍。 如何給結構體變量分配空間由編譯器決定,以上情況針對的是Linux下的GCC。在Windows下的VC平台也是這樣,至於其他平台,可能會有不同的處理。