size_t(無符號整數),定義於 <stddef.h>、<stdio.h> 等。
#include
#include
int main() {
size_t sz;
sz = sizeof(char); printf("%zu: char\n", sz);
sz = sizeof(unsigned char); printf("%zu: unsigned char\n", sz);
sz = sizeof(short); printf("%zu: short\n", sz);
sz = sizeof(int); printf("%zu: int\n", sz);
sz = sizeof(long); printf("%zu: long\n", sz);
sz = sizeof(long long); printf("%zu: long long\n", sz);
sz = sizeof(float); printf("%zu: float\n", sz);
sz = sizeof(double); printf("%zu: double\n", sz);
sz = sizeof(long double); printf("%zu: long double\n", sz);
sz = sizeof(wchar_t); printf("%zu: wchar_t\n", sz);
// 注意:實際大小隨平台/編譯器/模式(32/64位)變化
}
典型 64 位 Linux (LP64) 結果:char=1, short=2, int=4, long=8, pointer=8。Windows 64 位 (LLP64):long=4, long long=8, pointer=8。
int i; double d;
printf("%zu, %zu\n", sizeof(i), sizeof(int)); // 等價
printf("%zu, %zu\n", sizeof(d), sizeof(double)); // 等價
printf("%zu\n", sizeof i); // 變量可省略括號
printf("%zu\n", sizeof d);
int nums[10];
printf("%zu\n", sizeof nums); // 40 (10 * sizeof(int))
printf("%zu\n", sizeof nums / sizeof(int)); // 10 (元素個數)
這與 Delphi 等語言 SizeOf 返回元素個數不同,C 返回總位元組數。
void func(int arr[10]) {
printf("%zu\n", sizeof(arr)); // 8 (64位指標大小),非 40!
}
函數參數中數組退化為指標,sizeof 失去數組長度信息。
int *p = malloc(100 * sizeof(int));
printf("%zu\n", sizeof(p)); // 8 (指標大小),無法獲取 400
// 必須自行記錄分配大小
struct A { char c; int i; };
printf("%zu\n", sizeof(struct A)); // 通常 8 (含 3 字節填充)
sizeof 返回含對齊填充的總大小,而非成員大小之和。
size_t 而非 int:64 位系統 size_t 為 64 位,int 可能截斷。%zu (C99) 或 %lu + 強轉:printf("%zu", sizeof(x))。sizeof(i++) 不會執行 i++(不求值)。sizeof(arr) 其中 arr 為 VLA 會在運行期計算並求值其長度表達式。
#define STATIC_ASSERT(cond) sizeof(char[1 - 2*!(cond)])
STATIC_ASSERT(sizeof(int) == 4); // 失敗導致編譯錯誤:負數組大小
sizeof 是 C 語言靜態類型系統的鏡像,提供類型/對象大小的編譯期常量。掌握其對數組、指標、結構體、VLA 的不同行為,配合 size_t 與 %zu 正確使用,是編寫可移植、無警告 C 代碼的基礎技能。