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

C語言 sizeof 操作符深度解析:核心規則、陷阱案例與最佳實踐

     編輯:關於C語言

核心概念

sizeof 是編譯時單目操作符(非函數),以字節為單位返回操作數的存儲大小。不計算表達式值,僅推導類型。

基本用法

sizeof(int)        // 類型需加括號
sizeof variable    // 變量可省略括號
sizeof expression  // 表達式推導類型,不求值

關鍵規則

場景結果說明
基本類型實現定義如 int 常為 4,char 必為 1
數組總字節數char a[6] → 6
指針指針大小32位=4,64位=8,**非所指對象大小**
結構體含對齊填充可能大於成員總和
字符串字面量含結束符sizeof("abc") == 4

經典陷阱:數組退化為指針

void func(char arr[]) { // 實際是 char *arr
    printf("%zu\n", sizeof(arr)); // 輸出 4 或 8(指針大小),非數組長度
}

int main() {
    char a[6] = "hello";
    printf("%zu\n", sizeof(a)); // 6
    func(a);                    // 4/8
    return 0;
}

對策: 函數參數傳遞數組時,**必須額外傳遞長度**。

陷阱二:字符串字面量 vs 字符數組

char *p = "hello";  // 指向只讀區,sizeof(p)=指針大小
char a[] = "hello"; // 棧上數組,sizeof(a)=6

實用技巧

  • 元素個數宏:#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]))(僅適用於作用域內的數組)
  • 結構體柔性數組成員:struct { int len; char data[]; } 配合 malloc(sizeof(struct) + n)
  • sizeof 表達式不求值:sizeof(i++) 不會改變 i

總結

sizeof 是編譯期類型查詢工具,**數組退化為指針**是最大陷阱。牢記:只有在數組定義的作用域內,sizeof 才返回整個數組大小;傳遞函數、賦值給指針後均退化。善用 ARRAY_SIZE 宏、柔性數組、結構體對齊知識,編寫健壯的底層代碼。

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