sizeof和strlen的用法

2021-09-30 05:26:08 字數 3644 閱讀 6041

解析c/c++語言中的sizeof

一、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) 若此時char_v定義為char char_v [max]且max未知,sizeof(void)都不是正確形式。

三、sizeof的結果   

sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。

1、若運算元具有型別char、unsigned char或signed char,其結果等於1。

ansi c正式規定字元型別為1位元組。

2、int(4)、unsigned int(4) 、short int(2)、unsigned short(2) 、long int(4) 、unsigned long (4)、float(4)、double(8)、long double(8)型別的sizeof 在ansi c中沒有具體規定,大小依賴於實現括號內為sizeof的結果。

3、當運算元是指標時,sizeof依賴於編譯器。例如microsoft c/c++7.0中,near類指標位元組數為2,far、huge類指標位元組數為4。一般unix的指標位元組數為4, 一般來說指標位元組數為4。

例1:int *p;

int a[5];

p = a;

sizeof(p)的結果是4。

例2:const char* pstars=;

const int starcount=size of pstars/sizeof pstars[0];

starcount是指標陣列pstars中的元素個數4。

因為pstars是乙個常指標陣列,const代表指標中的資料不能修改,即不能使用諸如*pstars[0] = 'c';之類,會有編譯錯誤的。

先放下const不談,pstars的陣列成員是4個指標,所以其占用的空間是4個指標所占用的空間即4*4 = 16,而pstars[0]是該陣列的乙個元素,即乙個指標,所佔空間即為4個位元組。所以最後計算結果為4。

4、當運算元具有陣列型別時,其結果是陣列的總位元組數。

例如:int a[12];sizeof(a)的結果是12 * 4 = 48。

5、聯合型別運算元的sizeof是其最大位元組成員的位元組數。結構型別運算元的sizeof是這種型別物件的總位元組數,包括任何墊補在內。 

讓我們看如下結構:

struct a;

vc6.0結果為16。

這是因為編譯器在考慮對齊問題時,在結構中插入空位以控制各成員物件的位址對齊。如double型別的結構成員x要放在被8整除的位址。可以通過#pragma pack(n)改變位元組對齊。

例如:struct mystruct1;

預設的結構體的sizeof結果是24。

#pragma pack(2)

struct mystruct1;

此時結果為20。

我的推論:

預設時以最大位元組作為儲存單位,即8位元組,而對齊方式則以兩兩之間的最大位元組對齊,比如char與int以4位元組對齊,占用了乙個8位元組空間,short重新開始乙個8位元組空間,short與long以4位元組對齊,再結合成乙個8位元組空間,同時double單獨占用乙個8位元組空間,所以最後總空間為24位元組。

改變對齊方式為2位元組時,則char以2位元組後接int的2個2位元組,再接short的2位元組,再接long的2個2位元組最後接double的4個2位元組,此時計算總數為2位元組 *  (1+2+1+2+4)= 20位元組。

注意:#pragma pack()可以還原為預設對齊方式,而要改變其對齊方式,#pragma pack(n)必須放在使用之前。也可以使用

#pragma pack(push) //儲存對齊狀態

#pragma pack(pop)  //恢復對齊狀態

這一對來進行對齊方式的改變。

c++中類也是類似結構體的sizeof的計算方式,計算類物件中資料成員所占用的空間,不過static物件不計算在內。

例如:class a;

此時sizeof(a)的結果是1。

6、如果運算元是函式中的陣列形參或函式型別的形參,sizeof給出其指標的大小。

例如:void a(int *c)

printf("%d/n",sizeof(c));

void a(int c[13])

printf("%d/n",sizeof(c));

列印的都是4。

四、sizeof與其他操作符的關係

sizeof的優先順序為2級,比/、%等3級運算子優先順序高。它可以與其他操作符一起組成表示式。如i*sizeof(int);其中i為int型別變數。

五、sizeof的主要用途

1、sizeof操作符的乙個主要用途是與儲存分配和i/o系統那樣的例程進行通訊。例如:

void *malloc(size_t size),

size_t fread(void * ptr,size_t size,size_t nmemb,file * stream)。

2、sizeof的另乙個的主要用途是計算陣列中元素的個數。例如:

void * memset(void * s,int c,sizeof(s))。

六、建議

由於運算元的位元組數在實現時可能出現變化,建議在涉及到運算元位元組大小時用sizeof來代替常量計算。

解析c/c++語言中的strlen與sizeof的區別

1.從功能定義上,strlen函式,用來求字串的長度,sizeof函式是用來求指定變數或變數型別等所占用記憶體的大小;

2.sizeof是運算子,而strlen是c庫函式strlen只能用char*做引數,且以'/0'結尾的;

對於靜態陣列處理:

char str[20]="0123456789";

strlen(str)=10;   //表示陣列中字串的長度

sizeof(str)=20;   //表示陣列變數分配的長度

對於指標處理:

char *str="0123456789";

strlen(str)=10;     //表示字串的長度

sizeof(str)=4;      //表示指標變數的所佔記憶體大小

sizeof(*str)=1;     //表示'0'這個字元變數的所佔記憶體大小

參考:sizeof:

strlen:

以上均使用vc6.0進行測試。

sizeof和strlen的區別

sizeof與strlen的區別與聯絡 轉 1.sizeof操作符的結果型別是size t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。2.sizeof是算符,strlen是函式。3.sizeof可以用型別做引數,strlen只能用c...

strlen和sizeof的區別

sizeof與strlen的區別與聯絡 轉 1.sizeof操作符的結果型別是size t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。2.sizeof是算符,strlen是函式。3.sizeof可以用型別做引數,strlen只能用c...

sizeof和strlen的區別

sizeof和strlen都可以用來求變數的長度,但兩者之間還是有很大的區別的。首先,從2個例子講起 例1 charss 100 0123456789 sizeof ss 結果為100 ss表示在記憶體中預分配的大小,100 1 strlent ss 結果為10 它的內部實現是用乙個迴圈計算字串的長...