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

C 語言 sizeof 陷阱深度解析:數組退化為指針的經典案例與折半查找正確寫法

     編輯:關於C語言

現象重現

int a[9] = {1,2,3,4,5,6,7,8,9};
printf("%d\n", sizeof(a)); // 輸出 36 (9*4 bytes)

void m(int k[]) {
    printf("%d\n", sizeof(k)); // 輸出 4 (指針大小)
}

同一數組在主函數與參數函數中 sizeof 結果截然不同,原因在於數組作為函數參數時退化為指針。

核心原理

  • sizeof 是編譯期運算符,非函數。
  • 數組名在大多數表達式中轉換為「指向首元素的指針」,例外:sizeof(arr)、&arr、字符串字面值初始化。
  • 函數參數 int k[] 等價於 int *k,編譯器完全視為指針,失去長度信息。

正確計算數組長度的模式

int len = sizeof(arr) / sizeof(arr[0]); // 僅在數組定義的作用域有效

跨函數傳遞時,必須額外傳遞長度參數。

折半查找正確實現

int binarySearch(int arr[], int len, int target) {
    int left = 0, right = len - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2; // 防溢出
        if (arr[mid] == target) return mid;
        else if (arr[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
    return -1; // 未找到
}

int main() {
    int a[] = {1,2,3,4,5,6,7,8,9};
    int len = sizeof(a) / sizeof(int);
    int pos = binarySearch(a, len, 5); // 返回 4 (0-based)
    printf("索引: %d\n", pos);
    return 0;
}

避坑清單

  1. 函數參數用 int *arr 替代 int arr[],語義更清晰。
  2. 結構體含柔性數組成員時,sizeof 不包含柔性部分。
  3. 動態分配內存(malloc)返回指針,sizeof(ptr) 永遠是指針大小。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved