首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

三分鐘精通 C 語言 sizeof:核心概念、用法與經典坑點

     編輯:關於C

一、核心概念

sizeof 是單目運算子(如 ++、--),**非函數**。它在編譯期由編譯器根據運算元的**型別**計算佔用的**位元組數**,結果型別為 size_t(無號整數)。執行期零開銷。

二、兩種基本用法

形式範例說明
型別運算元sizeof(int)**必須加括號**。回傳該型別大小,視平台而定(x64 常為 4)。
運算式/變數運算元sizeof arr、sizeof(x+1)**可省略括號**。依運算式**靜態型別**決議大小,**不評估運算式**。

三、三大經典坑點

1. 陣列傳參退化為指標

int testSizeOf(char x[]) { return sizeof(x); }  // 等價 char *x
int main() {
    char y[6];
    printf("%d\n", testSizeOf(y));  // 輸出 4/8 (指標大小),而非 6
}

原因:函數參數宣告為陣列會被調整為指標,sizeof 見到的是指標型別。

2. 字串字面常數包含結尾 \0

printf("%zu\n", sizeof("0123456789"));  // 輸出 11 (10 字元 + \0)

字串字面常數在記憶體中以 \0 結尾,sizeof 計入此終止符。

3. 結構體對齊導致大小非單純加總

struct A { char c; int i; };  // sizeof 通常為 8 (非 5),因 4 位元組對齊
struct B { char c; char d; }; // sizeof 為 2

四、進階技巧

編譯期計算陣列元素數

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
int a[10];
printf("%zu\n", ARRAY_SIZE(a));  // 10
// 注意:不可用於指標參數

配合 _Generic (C11) 實現型別相關巨集


#define TYPE_SIZE(x) _Generic((x), \
    int: 4, long: 8, float: 4, double: 8, default: 0)

五、最佳實踐清單

  1. 型別運算元永遠加括號,變數運算元建議也加,統一風格。
  2. 格式化輸出用 %zu (C99),對應 size_t,避免 %d/%u 截斷警告。
  3. 勿對函數參數陣列使用 sizeof** 求長度,必須額外傳長度參數。
  4. 結構體設計時注意欄位排序以減少填充,必要時用 #pragma pack 或 _Alignas 控制對齊。
  5. 動態分配記憶體時,malloc(n * sizeof(*ptr)) 比 malloc(n * sizeof(TYPE)) 更易維護(型別變更自動適配)。

六、一表總覽

運算元結果備註
sizeof(int)4平台相關
sizeof 3.148預設 double
sizeof 'a'4字元常數為 int
sizeof "abc"4含 \0
int a[5]; sizeof(a)20完整陣列大小
void f(int a[]) { sizeof(a); }4/8退化為指標
struct {char c; int i;}8對齊填充

掌握以上核心規則,sizeof 將不再是 Bug 溫床,而是靜態分析與記憶體管理的得力工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved