sizeof 是 C 語言中唯一在**編譯期**計算的運算子(變長陣列除外),它返回型別或運算式佔用的位元組數。本文結合實例,徹底釐清基本型別大小、指標大小、陣列退化與位址輸出格式等核心概念。
#include <stdio.h>
int main() {
printf("sizeof(char) = %zu\n", sizeof(char)); // 1
printf("sizeof(short) = %zu\n", sizeof(short)); // 2
printf("sizeof(int) = %zu\n", sizeof(int)); // 4 (32/64位系統常見)
printf("sizeof(float) = %zu\n", sizeof(float)); // 4
printf("sizeof(double) = %zu\n", sizeof(double)); // 8
printf("sizeof(long) = %zu\n", sizeof(long)); // 4 (32位) 或 8 (64位 Linux/macOS)
return 0;
}
sizeof 返回 size_t(無號整數):輸出格式應用 %zu (C99),而非 %d。long 大小平台相關:Windows 64 位為 4 (LLP64),Linux/macOS 64 位為 8 (LP64)。char 永遠為 1:標準保證 sizeof(char) == 1,其他型別以 char 為單位衡量。#include <stdio.h>
int main() {
int sum = 99;
printf("sum 的位址: %p\n", (void *)&sum); // 正確輸出位址格式
printf("指標大小: %zu\n", sizeof(&sum)); // 4 (32位) 或 8 (64位)
return 0;
}
sum 的位址: 0x7ffeefbff5ac 指標大小: 8
| 運算式 | 結果 | 說明 |
|---|---|---|
| sizeof(int) | 4 | 型別大小 |
| sizeof(sum) | 4 | 變數型別大小 |
| sizeof(&sum) | 8/4 | 指標大小(平台相關) |
| sizeof(*&sum) | 4 | 解參考後為 int 型別 |
| sizeof(arr) | 40 | 陣列完整大小(不退化) |
| sizeof(arr[0]) | 4 | 單元素大小 |
| sizeof(*arr) | 4 | 等同 arr[0] |
sizeof(arr)、&arr(取陣列位址,型別為 int(*)[10])。int*。%d 輸出 sizeof:64 位系統 size_t 為 8 位元組,%d 只讀 4 位元組,導致輸出錯誤。%x/%d 輸出位址:必須用 %p 配合 (void*) 強轉,保證可移植性。sizeof 是編譯期運算子,掌握其「不求值、只看型別」特性與「陣列退化」例外規則,是寫出正確、可移植 C 程式的基石。位址輸出務必使用 %p,型別大小輸出務必使用 %zu。