配列を関数に渡すと 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() への呼び出しが 2 回行われます。 main() 関数内の最初の呼び出しでは、配列ポイントのサイズが 3 として正しく返されます。しかし、test() 関数内の 2 番目の呼び出しでは、誤って 2 が返されます。この結果の不一致は、配列ポイントがポインターに減衰するために発生します。それは関数に渡されました。
配列の劣化を克服する
関数に渡されたときに配列の実際のサイズを保持するには関数を使用するには、サイズを指定する追加パラメータを関数に明示的に渡す必要があります。
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]) を取得するトリック動的に割り当てられた配列では、配列サイズが常に機能するとは限りません。
以上がC の関数内と関数外で `sizeof()` が配列に対して異なる値を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。