関数に渡すときの配列サイズの不一致
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 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() 演算子は配列のサイズを正確に報告しますが、test() 関数内ではサイズが 1 要素分過小評価されます。 。この不一致は、配列が C の関数に渡されると、配列の最初の要素を参照するポインターに減衰するために発生します。その結果、sizeof(arr) は、基になる配列のサイズではなく、ポインターのサイズを計算します。
この問題を解決するには、配列のサイズを別のパラメーターとして関数に明示的に渡す必要があります。
void test(int arr[], size_t elems) { // ... } int main() { int point[3] = {50, 30, 12}; // ... test(point, sizeof(point) / sizeof(point[0])); // ... }
また、動的に割り当てられた配列 (ここには示されていません) の場合、標準 C ライブラリ関数 stdlib.h を使用して、配列のサイズ。
以上がC 関数に配列を渡すときに「sizeof」が間違った配列サイズを返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。