sizeof運算子介紹以及常見的坑

2021-10-04 18:17:16 字數 2201 閱讀 2008

sizeof是c語言的關鍵字,它用來計算變數(或資料型別)在當前系統中占用記憶體的位元組數。

sizeof不是函式,產生這樣的疑問是因為sizeof的書寫確實有點像函式,sizeof有兩種寫法:

用於資料型別

sizeof

(資料型別)

;

資料型別必須用括號括住。

printf

("字元型變數占用的記憶體是=%d\n"

,sizeof

(char))

;// 輸出:字元型變數占用的記憶體是=1

printf

("整型變數占用的記憶體是=%d\n"

,sizeof

(int))

;// 輸出:整型變數占用的記憶體是=4

用於變數

sizeof

(變數名)

;sizeof 變數名;

變數名可以不用括號括住,帶括號的用法更普遍,大多數程式設計師採用這種形式。

int ii;

printf

("ii占用的記憶體是=%d\n"

,sizeof

(ii));

// 輸出:ii占用的記憶體是=4

printf

("ii占用的記憶體是=%d\n"

,sizeof ii)

;// 輸出:ii占用的記憶體是=4

理論上講結構體的各個成員在記憶體中是連續存放的,和陣列非常類似,但是,結構體占用記憶體的總大小不一定等於全部成員變數占用記憶體大小之和。在編譯器的具體實現中,為了提高記憶體定址的效率,各個成員之間可能會存在縫隙。用sizeof可以得到結構體占用內容在總大小,sizeof(結構體名)或sizeof(結構體變數名)都可以。

示例(book90.c)

/*

* 程式名:book90.c,此程式用於演示c語言的結構體占用記憶體的情況

*/#include

// #pragma pack(1) # 告訴編器記憶體按1位元組對齊。

struct st_girl

;int

main()

執行效果

從上面的示例可以看出,struct st_girl全部成員變數占用的記憶體是50+4+4+30+30=118,但是結構體占用的記憶體是120。

注意,c語言提供了結構體成員記憶體對齊的方法,可以使結構體成員變數之間的記憶體沒有空隙,啟用#pragma pack(1)**即可。

printf

("sizeof(void)=%d\n"

,sizeof

(void))

;// 輸出sizeof(void)=1

以上**在有些編譯器中可能無法通過。

void是無值型或空型別,不知道儲存空間大小的型別,編譯器也不能確定它的大小。void不能宣告變數,以下**編譯無法通過:

void vv;
但是以下**是正確的:

void

*pv;

printf

("sizeof(void*)=%d\n"

,sizeof

(pv));

// 輸出sizeof(void)=8

pv是乙個void指標,在64位作業系統中,指標變數占用的記憶體的大小都是8,下同。

如果把乙個字串(如char strname[21])的位址傳給子函式,子函式用乙個字元指標(如char *pstr)來存放傳入的字串的位址,如果在子函式中用sizeof(pstr),得到的不是字串占用記憶體的位元組數,而是字元指標變數占用記憶體的位元組數(8位元組)。

所以,不能在子函式中對傳入的字串進行初始化,除非字串的長度也作為引數傳入到了子函式中。

如果把乙個結構體(如struct st_girl stgirl)的位址傳給子函式,子函式用乙個結構體指標(如struct st_girl *pgril)來存放傳入的結構體的位址,如果在子函式中用sizeof(pgirl),得到的不是結構體占用記憶體的位元組數,而是結構體指標變數占用記憶體的位元組數(8位元組)。正確的用法是用sizeof(struct st_girl)。

Mysql 常見運算子介紹

運算子作用 加法運算 減法運算 乘法運算 除法運算,返回商 求與運算,返回餘數 運算子作用 等於 安全的等於 不等於 小於等於 大於等於 大於is null 判斷乙個值是否為空 is not null 判斷乙個值是否不為空 least 在有兩個或者多個資料時,返回最小的那乙個 greatest 當有...

(24)位運算子 sizeof運算子

位運算子作用於整數型別,並把運算物件看成是二進位制的集合。位運算子提供檢查和設定二進位制位的功能,滿足左結合律。但是位運算關於符號位如何處理沒有明確的規定,改變符號位的值是一種未定義的行為,所以建議僅將位運算子作用於無符號 型。左移運算子 右移運算子 的行為則依賴於其左側運算物件物件的型別 如果該運...

sizeof運算子詳解

1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現什麼結果呢?sizeof mystruct 為多少呢?也許你會這樣求 sizeof mystruct sizeof double sizeof char sizeof in...