為什麼C 中函數內部的陣列大小計算不同
將陣列傳遞給函數時,C 會自動將陣列衰減為指標到它的第一個元素。此指標攜帶第一個陣列元素的位址,但不攜帶其大小。
考慮這個例子:
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); // Incorrect printf("%d\n", arrSize); } int main() { int point[3] = {50, 30, 12}; int arrSize = (int)(sizeof(point) / sizeof(point[0])); // Correct printf("%d\n", arrSize); // Prints 3 test(point); return 0; }
在 main 中,sizeof(point) 正確給出了整個陣列的大小 ( 12 位元組)。然而,在測試中,sizeof(arr) 產生 4 個位元組(整數指標的大小),導致陣列大小計算不正確(缺少一個元素)。
要解決此問題,必須明確指定數組大小作為單獨的參數傳遞:
void test(int arr[], size_t elems) { int arrSize = elems; /* ... */ } int main() { int point[3] = {50, 30, 12}; /* ... */ test(point, sizeof(point) / sizeof(point[0])); /* ... */ }
請注意,sizeof(point)/sizeof(point[0]) 適用於堆疊分配的數組,但不適用於動態分配的數組,因為它依賴於底層的衰減機制。
以上是為什麼「sizeof」在 C 函數內部和外部給出不同的陣列大小?的詳細內容。更多資訊請關注PHP中文網其他相關文章!