C語言詳解sizeof

2021-06-07 23:58:32 字數 3065 閱讀 6235

一、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的結果(以下結果都是在linux v2.6 gcc v4獲取)

sizeof操作符的結果型別是size_t

它在標頭檔案中定義為: typedef unsigned int size_t;

該型別保證能容納實現所建立的最大物件的位元組大小.

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

sizeof(char) 

= 1;

sizeof(unsigned char) = 1;

sizeof(signed char) 

= 1;

2、其他型別在ansi c中沒有具體規定,大小依賴於實現。

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) 

= 12;

3、當運算元是指標時,sizeof依賴於編譯器。

microsoft c/c++7.0中,near類指標位元組數為2,far、huge類指標位元組數為4。

一般unix/linux的指標位元組數為4。  

例如: char *p; 

//linux中

sizeof(p) = 4;

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

例如: char a[5];

int  b[5];

sizeof(a) = 5;

sizeof(b) = 20;

5、當運算元是具體的字串或者數值時,會根據具體的型別進行相應轉化。

例如: sizeof(8) 

= 4;  //自動轉化為int型別

sizeof(8.8) 

= 8;  //自動轉化為double型別,注意,不是float型別

sizeof("ab") = 3 

//自動轉化為陣列型別,

//長度是4,不是3,因為加上了最後的'\n'符

//有資料說,會自動轉化為指標型別(linux為4)

//可能和作業系統與編譯器有關係

6、當運算元是聯合型別時,sizeof是其最大位元組成員的位元組數。

當運算元是結構型別時,sizeof是其成員型別的總位元組數,包括補充位元組在內。  

還是讓我們拿例子來說話:

union  uu;

sizeof(u) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;

struct aa; 

在linux上: sizeof(a) = 12;

而一般sizeof(char) + sizeof(double) = 9;

這是因為編譯器在考慮對齊問題時,在結構中插入空位以控制各成員物件的位址對齊。

但如果全對齊的話,sizeof(a) = 16, 這是因為b被放到偏移量為0的位址,佔1個位元組;

在存放x時,double型別長度為8,需要放到能被8整除的偏移量上,這時候需要補7個空位元組,

達到8個,這時候偏移量為8,放上x後長度為16。

在此例中,所有的結構成員都要放在被4整除的位址(linux的存放方式),這裡補3個位元組,所以為12。

7、當運算元是函式中的陣列形參或函式型別的形參:

sizeof給出其指標的大小,linux中值為4。

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

sizeof的優先順序為2級,比/、%等3級運算子優先順序高。

它可以與其他操作符一起組成表示式:

例如: int i = 10;

i * sizeof(int);

五、sizeof的主要用途 

1、主要用途是與儲存分配和i/o系統那樣的例程進行通訊。

例如: void *malloc(size_t size);

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

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

例如: void *memset(void *s, int c, sizeof(s));  

c語言詳解sizeof

一 sizeof的概念 sizeof是c語言的一種單目操作符,如c語言的其他操作符 等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是乙個表示式或括在括號內的型別名。運算元的儲存大小由運算元的型別決定。二 sizeof的使用方法 1 用於資料型別 sizeof使用...

c語言詳解sizeof

一 sizeof的概念 sizeof是c語言的一種單目操作符,如c語言的其他操作符 等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是乙個表示式或括在括號內的型別名。運算元的儲存大小由運算元的型別決定。二 sizeof的使用方法 1 用於資料型別 sizeof使用...

c語言詳解sizeof

一 sizeof的概念 sizeof是c語言的一種單目操作符,如c語言的其他操作符 等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是乙個表示式或括在括號內的型別名。運算元的儲存大小由運算元的型別決定。二 sizeof的使用方法 1 用於資料型別 sizeof使用...