本文首先提出了處理VC++中結構體時應注意的一個問題,然後詳細分析了存在該問題的原因,最後做實戰訓練。
注意:
(1)在VC下,下面各類型占字節數為:char->unsigned int ->1; short int ->2; int ->unsigned int ->4; long ->float->4; double ->long double ->8
(2)在TC下,下面各類型占字節數為:char->unsigned int ->1; short int ->2; int ->unsigned int ->2; long ->float->4; double ->8; long double ->10
一、問題提出
首先,我們來看以下兩個小程序:
程序1:
#include <stdio.h>
struct struct1
{
char p1;
long p3;
};
main()
{
printf(″the size of the strcu=%d\n″, sizeof(struct1));
return(1);
}
運行結果是:the size of the struct=8
程序2:
#include <stdio.h>
struct struct2
{
char p1;
long p3;
short int p2;
};
main()
{printf(″the size of the struct=%d\n″, sizeof(struct2));
return(1);
}
運行結果是:the size of the struct=12
問題:顯然上述兩個程序的運行結果是不同的。然而仔細觀察上述兩個程序,它們的唯一區別是變量p2在結構體struct struct1和struct struct2中的位置不同。而這一不同是如何導致程序運行結果不同呢?
二、VC++中的結構體分析
C語言提供了一種稱為結構體的數據類型,它可以將不同類型的數據組合成一個有機整體,這樣不但便於引用,而且很清楚地反映出各數據項之間的內在聯系,因而在C語言中結構體得到廣泛的應用。正如我們已經熟知的那樣,在C語言中,結構體的長度等於各數據項長度之和,而且結構體的長度與數據項在其中的位置順序無關。例如,在TurboC中運行上述兩個例子中的程序,得到的結果都是the size of the struct=7。這是由於char數據類型的長度是1,long數據類型的長度是4,而short int數據類型的長度是2,從而得到1+2+4=7。
那麼為什麼上述兩個例子在VC++環境下所得的結果各不相同並且均不是7呢?在實際應用中,我們發現VC++中為結構體變量分配內存時與C語言不同:VC++中為結構體分配內存時,先分配一單位長度(該單位長度的大小等於結構體中占內存最多數據類型,如struct2的單位長度為數據類型long的長度4。),然後在該單位長度中依次為結構中的變量分配空間,直至該單位空間不能再分配完一個完整的變量時為止,就再為該結構體分配另一個單位長度的存儲空間。如結構體struct2:首先,分配4個字節,p1占1個字節後,剩余的3個字節不足以分配p3,於是,系統為struct2再分配4個字節分給p3,接著下4個字節分給p2,把以,struct2共有4+4+4=12個字節。再如結構體struct1:同樣先分配4個字節,p1占1個字節後,還可為p2分配2個字節,顯然剩余的1個字節不足以為p3分配空間了,因此系統還要再為該結構體分配4個字節,該4個字節恰好是p3所需的,所以struct1共有4+4=8個字節。
至此我們便不難理解上述兩個例子中的結果是如何算出來的。其中,例1中是4+4=8,而例2中是4+4+4=12。
三、實戰
(1)、
struct structData1
{
int i;
char ch;
double d;
short s;
float f;
long l;
};
sizeof(struct structDate1) =(4+1+3空)+(8)+(2+4+2空)+(4+4空)=32
(2)、
struct structData2
{
short int s1;
char ch1;
short int s2;
char ch2;
};
sizeof(struct structDate2) =(2)+(1+1空)+(2)+(1+1空)=8
(3)、
struct structData3
{
int s1;
char ch1;
short int s2;
char ch2;
};
sizeof(struct structDate3) =(4)+(1+2+1空)+(1+3空)=12