了解傳遞給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中文網其他相關文章!