首頁 >後端開發 >C++ >為什麼「sizeof()」在傳遞給 C 函數時會傳回不正確的陣列大小?

為什麼「sizeof()」在傳遞給 C 函數時會傳回不正確的陣列大小?

Patricia Arquette
Patricia Arquette原創
2025-01-01 10:41:11211瀏覽

Why Does `sizeof()` Return Incorrect Array Sizes When Passed to C Functions?

了解傳遞給C 中函數的陣列的sizeof() 值的差異

在C 中,陣列在傳遞時可能會表現出意外的行為到功能。問題出現了:為什麼 sizeof() 運算子在將陣列傳遞給函數時傳回錯誤的值,而它在函數呼叫之前提供了正確的值?

要解決這個問題,我們必須了解數組在 C 中,當傳遞給函數時會經歷指標衰減。當傳遞一個陣列時,它退化為指向數組第一個元素的指標。因此,在函數參數上使用 sizeof() 會計算指標的大小,而不是整個陣列。

問題中給出了一個典型範例:

#include <stdio.h>

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

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;
}

在main( ) 函數中,正確的陣列大小是透過將分配的記憶體大小(使用sizeof(point) 取得)除以每個元素的大小(sizeof(point[0]))來確定的。但是,在 test() 函數中,計算出的陣列大小不正確,因為 sizeof(arr) 傳回的是指向陣列的指標的大小,而不是陣列本身。

要解決此問題並允許函數確定數組的大小,它應該作為單獨的參數傳遞:

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 ]) 技巧僅有效對於堆疊上分配的陣列。對於動態分配的數組,它將傳回錯誤的結果,因為數組的大小不會與指標一起儲存。

以上是為什麼「sizeof()」在傳遞給 C 函數時會傳回不正確的陣列大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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