C sizeof的使用總結

2021-05-24 23:57:28 字數 2891 閱讀 9969

說明:以下**在

vs2008

中通過,在

32位作業系統下。

1.

定義

sizeof

是乙個操作符(

operator

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

其返回值型別為

size_t

。(size_t

在標頭檔案

stddef.h

中定義,它依賴於編譯系統的值,一般定義為

typedef unsigned int size_t;

2.

語法

sizeof

有三種語法形式:

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

2)sizeof object;//sizeof

物件3)

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

物件可以是各種型別的變數,以及表示式(一般

sizeof

不會對表示式進行計算)。

sizeof

對物件求記憶體大小,最終都是轉換為對物件的資料型別進行求值。

sizeof (

表示式); //

值為表示式的最終結果的資料型別的大小

例子:(

32位機器下)

最新的c99

標準規定

sizeof

也可以在執行時刻進行計算。

如下面的程式在

dev-c++

中可以正確執行:

但在沒有完全實現

c99標準的編譯器中就行不通了,上面的**在

vc6中就通不過編譯。所以我們最好還是認為

sizeof

是在編譯期執行的,這樣不會帶來錯誤,讓程式的可移植性強些。

1.

基本資料型別的

sizeof

這裡的基本資料型別是指

short

、int

、long

、float

、double

這樣的簡單內建資料型別。

由於它們的記憶體大小是和系統相關的,所以在不同的系統下取值可能不同。

2.

結構體的

sizeof

結構體的

sizeof

涉及到位元組對齊問題。

為什麼需要位元組對齊?計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令週期了。為此,編譯器缺省會對結構體進行處理(實際上其它地方的資料變數也是如此),讓寬度為

2的基本資料型別(

short

等)都位於能被

2整除的位址上,讓寬度為

4的基本資料型別(

int等)都位於能被

4整除的位址上,依次類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的

sizeof

值就增長了。

位元組對齊的細節和編譯器的實現相關,但一般而言,滿足三個準則: 1)

結構體變數的首位址能夠被其最寬基本型別成員的大小所整除。 2)

結構體的每個成員相對於結構體首位址的偏移量(

offset

)都是成員大小的整數倍,如有需要,編譯器會在成員之間加上填充位元組(

internal adding)。

3)結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要,編譯器會在最末乙個成員後加上填充位元組(

trailing padding)。

注意:空結構體(不含資料成員)的

sizeof值為1

。試想乙個「不佔空間「的變數如何被取位址、兩個不同的「空結構體」變數又如何得以區分呢,於是,「空結構體」變數也得被儲存,這樣編譯器也就只能為其分配乙個位元組的空間用於佔位了。

例子:

3.

聯合體的

sizeof

結構體在記憶體組織上市順序式的,聯合體則是重疊式,各成員共享一段記憶體;所以整個聯合體的

sizeof

也就是每個成員

sizeof

的最大值。

例子:

4.

陣列的sizeof

陣列的sizeof

值等於陣列所占用的記憶體位元組數。

注意:1)當字元陣列表示字串時,其

sizeof

值將』/0』

計算進去。 2

)當陣列為形參時,其

sizeof

值相當於指標的

sizeof

值。例子1:

例子2:

5.

指標的sizeof

指標是用來記錄另乙個物件的位址,所以指標的記憶體大小當然就等於計算機內部位址匯流排的寬度。 在

32位計算機中,乙個指標變數的返回值必定是4。

指標變數的

sizeof

值與指標所指的物件沒有任何關係。

例子:

6.

函式的sizeof

sizeof

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

對函式求值的形式:

sizeof(

函式名(

實參表))

注意:1

)不可以對返回值型別為空的函式求值。 2

)不可以對函式名求值。 3

)對有引數的函式,在用

sizeof

時,須寫上實參表。

例子:

c sizeof 的使用總結

說明 以下 在 vs2008 中通過,在 32位作業系統下。1.定義 sizeof是乙個操作符 operator 其作用是返回乙個物件或型別所佔的記憶體位元組數。其返回值型別為size t。size t在標頭檔案stddef.h中定義,它依賴於編譯系統的值,一般定義為 typedef unsigne...

C sizeof的使用總結

說明 以下 在 vs2008 中通過,在 32位作業系統下。1.定義 sizeof是乙個操作符 operator 其作用是返回乙個物件或型別所佔的記憶體位元組數。其返回值型別為size t。size t在標頭檔案stddef.h中定義,它依賴於編譯系統的值,一般定義為 typedef unsigne...

C sizeof的使用總結

說明 以下 在vs2008中通過,在32位作業系統下。1.定義 sizeof是乙個操作符 operator 其作用是返回乙個物件或型別所佔的記憶體位元組數。其返回值型別為size t。size t在標頭檔案stddef.h中定義,它依賴於編譯系統的值,一般定義為 typedef unsigned i...