C 語言

sizeof 運算子

在這台機器上一個 int 佔幾個位元組?這個 struct 連同填充一共多大?與其猜測或寫死數字,C 給你一個內建的方式去問:sizeof 運算子。你把它套用在一個型別或一個值上,它就回給你那個型別或值在記憶體中佔用的位元組數。

寫 sizeof(int) 取得 int 型別的大小,或 sizeof(x) 取得變數 x 的大小;結果是 size_t 型別的值(一種專為大小設計的無號整數型別)。關鍵且常被忽略的事實是:sizeof 是一個「編譯期」運算子,而非執行期的函式呼叫——編譯器在建構程式時就算出答案,所以執行時毫無成本,而運算元通常甚至不被求值。因為答案在編譯期就已知,求陣列元素個數的標準慣用法是 sizeof(arr) / sizeof(arr[0]):整個陣列的位元組除以一個元素的位元組。

為什麼重要與尖銳的提醒:sizeof 是你寫出可攜、正確、不假設型別大小之程式碼的方式——你用 sizeof 來決定 malloc 的大小,用它來算陣列長度。陷阱是這個算元素個數的技巧「只」對真正的陣列有效,對指標無效。一旦陣列被傳給函式它就退化成指標,所以在那個函式內 sizeof 給的是指標的大小(在 64 位元機器上通常是 8 位元組),不是陣列——長度沒能熬過退化,你必須另外把它傳過去。

int arr[10]; size_t n = sizeof(arr) / sizeof(arr[0]); /* n == 10 個元素 */ int *p = arr; /* sizeof(p) 是指標大小(例如 8),不是陣列的 40 */ int *block = malloc(50 * sizeof(int)); /* 決定配置大小 */

算元素個數的技巧對真正的陣列 arr 有效,對指標 p 無效,因為指標已失去陣列的長度。

sizeof 是編譯期運算子,不是執行期函式;它的運算元通常不被求值。sizeof(陣列) 給整個陣列的位元組,但對指標(包括退化後的陣列參數)用 sizeof 只給指標的大小——陣列長度無法熬過退化。

又称
sizeofsize-of operator取大小運算子