為什麼將陣列傳遞給函數會改變其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中文網其他相關文章!