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

C 語言 sizeof 運算子深度解析:用法、陷阱與最佳實踐

     編輯:關於C語言

sizeof 是 C 語言的單目運算子 (非函式),在 編譯期 計算運算元的位元組大小,回傳型別為 size_t (無號整數)。正確理解 sizeof 對記憶體管理、結構體對齊、跨平台移植至關重要。

語法形式

sizeof(type)        // 型別需加括號
sizeof expression   // 運算式可不加括號
sizeof variable     // 變數可不加括號

注意:sizeof int 是錯誤的,必須寫 sizeof(int)。

核心規則與常見型別大小

類別規則 / 大小 (典型 64 位系統)
基本型別 char=1, short=2, int=4, long=8, float=4, double=8, long double=16
指標 固定 8 位元組 (64 位系統),與指向型別無關
陣列 總位元組數 = 元素個數 × 元素大小。不退化為指標
結構體/聯合 含對齊填充位元組。聯合取最大成員大小
函式參數陣列 退化為指標,sizeof 回傳指標大小 (8)

關鍵陷阱:陣列退化

void func(int arr[10]) {
    // 這裡 arr 是指標,非陣列!
    printf("%zu\n", sizeof(arr)); // 輸出 8 (指標大小),非 40
}

解決:傳遞陣列大小作為額外參數,或使用結構體包裹陣列。

結構體對齊實戰

struct A { char c; int i; };      // 大小 8 (c+3填充+i)
struct B { int i; char c; };      // 大小 8 (i+c+3填充)
struct C { char c; double d; };   // 大小 16 (c+7填充+d)

原則:成員偏移量為其大小倍數;結構體總大小為最大成員大小倍數。可用 #pragma pack(n) 或屬性 `__attribute__((packed))` 壓縮對齊。

實用技巧

  • 計算陣列元素數:sizeof(arr) / sizeof(arr[0])
  • 動態記憶體分配:malloc(n * sizeof(*ptr)) — 變更型別時無需修改 sizeof 參數。
  • 編譯期常數:可用於陣列宣告 char buf[sizeof(struct Header)];
  • 避免硬編碼:永遠用 sizeof 取代魔術數字,增強可移植性。

C99 新特性:可變長度陣列 (VLA)

int n = 10;
int arr[n];              // 合法
printf("%zu\n", sizeof(arr)); // 執行期計算,輸出 40

注意:VLA 不可為 static/extern,大小受限於堆疊空間,現代 C 標準 (C11) 將其列為可選特性,建議謹慎使用。

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