一.sizeof()
1.sizeof的使用:sizeof操作符以位元組形式給出了其運算元的儲存大小.
sizeof操作符不能用於函數類型,不完全類型或位欄位。不完全類型指具有未知儲存大小的資料類型,如未知儲存大小的數群組類型、未知內容的結構或等位型別、void類型等。
2.sizeof的結果:sizeof操作符的結果類型是size_t,它在標頭檔中typedef為unsigned int類型。該類型保證能容納實現所建立的最大對象的位元組大小。
int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、float、double、long double類型的sizeof 在ANSI C中沒有具體規定,大小依賴於實現,一般可能分別為2、2、2、2、4、4、4、8、10。
當運算元是指標時,sizeof依賴於編譯器。near類指標位元組數為2,far、huge類指標位元組數為4。一般Unix的指標位元組數為4。
當運算元具有數群組類型時,其結果是數組的總位元組數,等位型別運算元的sizeof是其最大位元組成員的位元組數。
結構類型運算元的sizeof是這種類型對象的總位元組數,包括任何墊補在內.
如果運算元是函數中的數組形參或函數類型的形參,sizeof給出其指標的大小。
struct MyStruct
{
char dda;//位移量為0,滿足對齊,dda佔用1個位元組;
double dda1;//下一個可用的地址的位移量為1,不是sizeof(double)=8
//的倍數,需要補足7個位元組才能使位移量變為8(滿足對齊
//方式),因此VC自動填滿7個位元組,dda1存放在位移量為8
//的地址上,它佔用8個位元組。
int type;//下一個可用的地址的位移量為16,是sizeof(int)=4的倍
//數,滿足int的對齊,所以不需要VC自動填滿,type存
//放在位移量為16的地址上,它佔用4個位元組。
};//所有成員變數都分配了空間,空間總的大小為1+7+8+4=20,不是結構
//的節邊界數(即結構中佔用最大空間的類型所佔用的位元組數sizeof
//(double)=8)的倍數,所以需要填充4個位元組,以滿足結構的大小為
//sizeof(double)=8的倍數
所以該結構總的大小為:sizeof(MyStruc)為1+7+8+4+4=24。其中總的有7+4=11個位元組是VC自動填滿的,沒有放任何有意義的東西.