一、sizeof的概念
Sizeof是C語言的一種單目操作符,如C語言的其他操作符++、--等。它並不是函數。Sizeof操作符以字節形式給出了其操作數的存儲大小。操作數可以是一個表達式或括在括號內的類型名。操作數的存儲大小由操作數的類型決定。
二、sizeof的使用方法
1、用於數據類型
sizeof使用形式:sizeof(type)
數據類型必須括號括住,如sizeof(int)。
2、用於變量
sizeof使用形式:sizeof(var_name)或sizeof var_name
變量名可以不用括號括住。如sizeof(var_name),sizeof var_name等都是正確形式。帶括號的用法更普遍,大多數程序員采用這種形式。
注意:sizeof操作符不能用於函數類型,不完全類型或位字段。不完全類型指具有未知存儲大小的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void類型等。
如sizeof(max),變量max定義為int max();sizeof(char_v),cha_vr定義為char char_v[MAX]且MAX未知;sizeof(void)等,這些都不是正確形式。
三、sizeof的結果
Sizeof操作符的結果類型是size_t,它在頭文件中typedef為unsigned int類型。該類型保證能容納實現所建立的最大對象的字節大小。(這里指在64位系統)
1、若操作數具有類型char、unsigned char或signed char,其結果等於1。
ANSI C正式規定字符類型為1字節,sizeof(char)=1。
2、int、unsigned int、short int、unsigned short、long int、unsigned long、float、double、long double類型的sizeof在ANSI C中沒有具體規定,大小依賴於現實,這里用64位系統測試,分別為:
sizeof(int)=4
sizeof(unsigned int)=4
sizeof(short int)=2
sizeof(unsigned short)=2
sizeof(long int)=4
sizeof(unsigned long)=4
sizeof(float)=4
sizeof(double)=8
sizeof(long double)=8
3、當操作數是指針時,sizeof依賴於編譯器。例如Microsoft C/C++7.0中,near類指針字節數為2,far、huge類指針字節數為4。一般Unix的指針字節數為4。
4、當操作數具有數組類型時,其結果是數組的總字節數。
如:int a[10],sizeof(a)=40。
5、聯合類型操作數的sizeof是其最大字節成員的字節數。
如:typedef union IP{
char a[1];
int net;
}ip;
sizeof(ip)=4。
6、結構類型操作數的sizeof是這種類型對象的總字節數,包括任何鋪墊在內。因為一個變量的地址一般會是這個變量本身所占字節數的倍數。
char 1的倍數
short 2的倍數
int 4的倍數
double 8的倍數
typedef struct Goods{
char name[18];//18
double price;/4的倍數,從20開始
char special;//1的倍數,從28開始
int num;//4的倍數,從32開始
short saled;//2的倍數,從36開始
}gs;
name | ....... | price |special| | | | num | saled | | | name| | |
0 18 20 28 29 32 36 38.....新的變量,4的倍數開始
printf(“sizeof(gs)=%d\n”,sizeof(gs)) ==> 38,但是在系統中運行為48,不理解耶!!!!
7、如果操作數是函數中的數組形參或函數類型的形參,sizeof給出其只針對的大小。
void demo(char a){
printf("sizeof(a)=%d\n",sizeof(a));
}
調用形式demo(‘a’)。
輸出結果為:sizeof(a)=4。
四、sizeof與其他操作符的關系
Sizeof的優先級為2級,比/、%等3級運算符優先級高。它可以與其他操作符一起組成表達式。如i*sizeof(int),其中i為int類型變量。
五、sizeof的主要用途
1、sizeof操作符的一個主要用途是與存儲分配和I/O系統那樣的例程進行通信。例如:
void *malloc(size_t size),
sizeof_t fread(void* ptr , size_t size , size_t nmemb , FILE* stream)。
2、sizeof的另一個的主要用途是計算數組中元素的個數,例如:
void* memset(void* s , int c , sizeof(s))。
六、建議
由於操作數的字節數在實現時可能出現變化,建議在涉及到操作數字節大小時用sizeof來代替常量計算。
七、實例
一道筆試題,請寫出下面代碼在32位平台上的運行結果,並說明sizeof的性質:
#include <stdio.h> #include <stdlib.h> int main(){ char a[30]; char *b = (char*)malloc(20*sizeof(char)); printf("sizeof(a)=%d\n",sizeof(a)); printf("sizeof(b)=%d\n",sizeof(b)); printf("sizeof(a[3])=%d\n",sizeof(a[3])); printf("sizeof(b+3)=%d\n",sizeof(b+3)); printf("sizeof(*(b+4))=%d\n",sizeof(*(b+4))); return 0; } |
結果為:
sizeof(a)=30 sizeof(b)=4 sizeof(a[3])=1 sizeof(b+3)=4 sizeof(*(b+4))=1 |
Sizeof計算字節數是和平台相關的。