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

C語言 sizeof 深度解析:操作符本質、陣列退化與指針算術陷阱

     編輯:關於C語言

C語言 sizeof 深度解析:操作符本質、陣列退化與指針算術陷阱

sizeof 是**編譯期操作符**,非函數,單位為字節 (char 大小)。

核心規則

  • 對類型:sizeof(int)、sizeof(int[10]) 需括號。
  • 對表達式:sizeof a、sizeof a+1 (解析為 (sizeof a)+1) 不需括號。
  • **不求值**:sizeof(a++) 不會執行 a++,a 值不變。

案例 1:函數參數退化

void fun(int arr[10]) {
    printf("%zu\n", sizeof(arr)); // 輸出 4/8 (指針大小),非 40
}
int main() {
    int arr[10];
    fun(arr);        // 4/8
    printf("%zu\n", sizeof(arr)); // 40 (此處 arr 為陣列類型)
    return 0;
}

案例 2:sizeof(a++) 不求值

short a = 0;
printf("%zu\n", sizeof(a++)); // 2 (short大小)
printf("%d\n", a);            // 0 (a未增)!

案例 3:陣列名 vs 取址

int arr[10];
printf("%p\n", arr);    // &arr[0] 首元素地址
printf("%p\n", &arr);   // 陣列地址 (類型 int(*)[10])
// 數值相同,類型語義不同!
int *p = arr;           // p+1 跳 4 字節
int (*q)[10] = &arr;    // q+1 跳 40 字節 (整個陣列)

實戰陷阱

  • 結構體對齊:sizeof(struct) 可能大於成員大小之和 (填充位)。
  • 動態分配:malloc(n * sizeof(*ptr)) 比 malloc(n * sizeof(Type)) 更易維護。
  • 可變長度陣列 (VLA):sizeof(vla) 在**運行期**求值 (C99)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved