c語言詳解sizeof

2021-10-09 08:56:02 字數 2919 閱讀 7118

一、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使用...