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