C語言 sizeof函式詳解

2021-10-04 19:05:35 字數 2846 閱讀 4087

sizeof,乙個其貌不揚的傢伙,引無數菜鳥竟折腰,小蝦我當初也沒少犯迷糊,秉著「

辛苦我乙個,幸福千萬人」的偉大思想,我決定將其盡可能詳細的總結一下。

但當我總結的時候才發現,這個問題既可以簡單,又可以複雜,所以本文有的地方並不

適合初學者,甚至都沒有必要大作文章。但如果你想「知其然,更知其所以然」的話,

那麼這篇文章對你或許有所幫助。

菜鳥我對c++的掌握尚未深入,其中不乏錯誤,歡迎各位指正啊

1. 定義:

sizeof是何方神聖sizeof乃c/c++中的乙個操作符(operator)是也,簡單的說其作

用就是返回乙個物件或者型別所佔的記憶體位元組數。

msdn上的解釋為:

the sizeof keyword gives the amount of storage, in bytes, associated with a

variable or a type (including aggregate types).

this keyword returns a value of type size_t.

其返回值型別為size_t,在標頭檔案stddef.h中定義。這是乙個依賴於編譯系統的值,一

般定義為

typedef unsigned int size_t;

世上編譯器林林總總,但作為乙個規範,它們都會保證char、signed char和unsigned

char的sizeof值為1,畢竟char是我們程式設計能用的最小資料型別。

2. 語法:

sizeof有三種語法形式,如下:

1) sizeof( object ); // sizeof( 物件 );

2) sizeof( type_name ); // sizeof( 型別 );

3) sizeof object; // sizeof 物件;

所以,int i;

sizeof( i ); // ok

sizeof i; // ok

sizeof( int ); // ok

sizeof int; // error

既然寫法3可以用寫法1代替,為求形式統一以及減少我們大腦的負擔,第3種寫法,忘

掉它吧!

實際上,sizeof計算物件的大小也是轉換成對物件型別的計算,也就是說,同種型別的

不同物件其sizeof值都是一致的。這裡,物件可以進一步延伸至表示式,即sizeof可以

對乙個表示式求值,編譯器根據表示式的最終結果型別來確定大小,一般不會對表示式

進行計算。如:

sizeof( 2 );// 2的型別為int,所以等價於 sizeof( int );

sizeof( 2 + 3.14 ); // 3.14的型別為double,2也會被提公升成double型別,所以等價

於 sizeof( double );

sizeof也可以對乙個函式呼叫求值,其結果是函式返回型別的大小,函式並不會被呼叫

,我們來看乙個完整的例子:

char foo()

int main()

c99標準規定,函式、不能確定型別的表示式以及位域(bit-field)成員不能被計算s

izeof值,即下面這些寫法都是錯誤的:

sizeof( foo );// error

void foo2()

sizeof( foo2() );// error

struct s

;sizeof( s.f1 );// error

3. sizeof的常量性

sizeof的計算發生在編譯時刻,所以它可以被當作常量表示式使用,如:

char ary[ sizeof( int ) * 10 ]; // ok

最新的c99標準規定sizeof也可以在執行時刻進行計算,如下面的程式在dev-c++中可以

正確執行:

int n;

n = 10; // n動態賦值

char ary[n]; // c99也支援陣列的動態定義

printf("%d/n", sizeof(ary)); // ok. 輸出10

但在沒有完全實現c99標準的編譯器中就行不通了,上面的**在vc6中就通不過編譯。

所以我們最好還是認為sizeof是在編譯期執行的,這樣不會帶來錯誤,讓程式的可移植

性強些。

4. 基本資料型別的sizeof

這裡的基本資料型別指short、int、long、float、double這樣的簡單內建資料型別,

由於它們都是和系統相關的,所以在不同的系統下取值可能不同,這務必引起我們的注

意,盡量不要在這方面給自己程式的移植造成麻煩。

一般的,在32位編譯環境中,sizeof(int)的取值為4。

5. 指標變數的sizeof

學過資料結構的你應該知道指標是乙個很重要的概念,它記錄了另乙個物件的位址。既

然是來存放位址的,那麼它當然等於計算機內部位址匯流排的寬度。所以在32位計算機中

,乙個指標變數的返回值必定是4(注意結果是以位元組為單位),可以預計,在將來的6

4位系統中指標變數的sizeof結果為8。

char* pc = "abc";

int* pi;

string* ps;

char** ppc = &pc;

void (*pf)();// 函式指標

sizeof( pc ); // 32位系統下結果為4

sizeof( pi ); // 32位系統下結果為4

sizeof( ps ); // 32位系統下結果為4

sizeof( ppc ); // 32位系統下結果為4

sizeof( pf );// 32位系統下結果為4

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