首頁 >後端開發 >C++ >為什麼 C 中函數內部和外部的陣列「sizeof()」會傳回不同的值?

為什麼 C 中函數內部和外部的陣列「sizeof()」會傳回不同的值?

Barbara Streisand
Barbara Streisand原創
2024-12-21 18:35:09888瀏覽

Why Does `sizeof()` Return Different Values for Arrays Inside and Outside a Function in C?

為什麼將陣列傳遞給函數會改變其sizeof() 值

在C 程式設計中,將陣列傳遞給函數可能會導致函數使用sizeof() 檢索它時有關其大小的意外行為。這種特性是由於數組衰減的概念而產生的。

陣列衰減解釋

當陣列傳遞給函數時,它會隱式轉換或「衰減」為指向其第一個元素的指標。此轉換有效地隱藏了數組的真實大小,因為 sizeof() 現在對指標而不是原始數組進行操作。

程式碼範例

考慮以下程式碼片段:

#include <stdio.h>

void test(int arr[]) {
    int arrSize = (int)(sizeof(arr) / sizeof(arr[0]));
    printf("%d\n", arrSize); // 2 (incorrect)
}

int main(int argc, const char * argv[]) {
    int point[3] = {50, 30, 12};

    int arrSize = (int)(sizeof(point) / sizeof(point[0]));
    printf("%d\n", arrSize); // 3 (correct)

    test(point);

    return 0;
}

在此範例中,對 sizeof() 進行了兩次呼叫。 main() 函數中的第一次呼叫正確傳回數組點的大小為 3。但是,test() 函數中的第二次呼叫錯誤地傳回 2。出現這種結果不匹配的原因是數組點在以下情況下衰減為指標:它被傳遞給函數。

克服數組衰減

在傳遞給 a 時保留數組的真實大小函數中,必須明確向函數傳遞一個指定大小的附加參數。

void test(int arr[], size_t elems) {
   /* ... */
}

int main(int argc, const char * argv[]) {
   int point[3] = {50, 30, 12};
   /* ... */
   test(point, sizeof(point)/sizeof(point[0]));
   /* ... */
}

透過將大小作為單獨的參數傳遞,函數可以準確地確定數組的真實大小並執行相應的操作.

注意:

取得陣列的sizeof(point)/sizeof(point[0])技巧size 可能不會總是適用於動態分配的陣列。

以上是為什麼 C 中函數內部和外部的陣列「sizeof()」會傳回不同的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn