c語言之sizeof總結


一、sizeof的概念

SizeofC語言的一種單目操作符,如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,它在頭文件中typedefunsigned int類型。該類型保證能容納實現所建立的最大對象的字節大小。(這里指在64位系統)

1、若操作數具有類型charunsigned charsigned char,其結果等於1

ANSI C正式規定字符類型為1字節,sizeof(char)=1

 

 

2intunsigned intshort intunsigned shortlong intunsigned longfloatdoublelong double類型的sizeofANSI 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類指針字節數為2farhuge類指針字節數為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),其中iint類型變量。

 

五、sizeof的主要用途

1sizeof操作符的一個主要用途是與存儲分配和I/O系統那樣的例程進行通信。例如:

void *malloc(size_t size),

sizeof_t fread(void* ptr , size_t size , size_t nmemb , FILE* stream)

 

2sizeof的另一個的主要用途是計算數組中元素的個數,例如:

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計算字節數是和平台相關的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM