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; }
In the 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 中国語 Web サイトの他の関連記事を参照してください。