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

C 語言陣列傳遞函數退化為指標:sizeof 失效原因與解決之道

     編輯:關於C語言

C 語言陣列傳遞函數退化為指標:sizeof 失效原因與解決之道

問題現場

void sort(int arr[]) {
    int len = sizeof(arr) / sizeof(arr[0]); // 錯誤!arr 是指標
    // ...
}
int main() {
    int a[] = {99,66,33,2,5,61,6};
    sort(a); // 傳遞陣列首址
}

sizeof(arr) 在函數內返回指標大小 (4 或 8 位元組),非陣列總大小。

根本原因

C 標準規定:陣列作為函數參數時,退化為指向首元素的指標。以下三種宣告等價:

void f(int arr[]);
void f(int arr[10]); // 10 被忽略
void f(int *arr);    // 本質

三種解決方案

  1. 額外傳長度 (最常用、最通用):void sort(int arr[], int len)。
  2. 結構體封裝:struct Array { int *data; int len; };。
  3. 特定長度陣列指標 (C99):void sort(int (*arr)[10]) 僅接受長度 10 陣列,sizeof(*arr) 有效但靈活性差。

修正後程式碼

void sort(int arr[], int len) {
    for (int i = 0; i < len-1; ++i)
        for (int j = 0; j < len-1-i; ++j)
            if (arr[j] > arr[j+1]) {
                int t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t;
            }
}
int main() {
    int a[] = {99,66,33,2,5,61,6};
    int len = sizeof(a)/sizeof(a[0]); // 主程式正確計算
    sort(a, len);
    // ...
}

最佳實務

  • 永遠在呼叫端計算長度並傳遞。
  • 文件化註明參數 len 為元素個數。
  • C++ 直接用 std::vector/std::array 避免此問題。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved