C の関数内で配列サイズの計算が異なる理由
配列を関数に渡すと、C は配列を自動的にポインタに分解します最初の要素に。このポインタは、最初の配列要素のアドレスを保持しますが、そのサイズは保持しません。
次の例を考えてみましょう。
#include <stdio.h> void test(int arr[]) { int arrSize = (int)(sizeof(arr) / sizeof(arr[0])); // Incorrect printf("%d\n", arrSize); } int main() { int point[3] = {50, 30, 12}; int arrSize = (int)(sizeof(point) / sizeof(point[0])); // Correct printf("%d\n", arrSize); // Prints 3 test(point); return 0; }
main では、sizeof(point) は配列全体のサイズを正しく示します ( 12バイト)。ただし、テスト内では、sizeof(arr) は 4 バイト (整数ポインターのサイズ) を生成し、配列サイズの計算が正しくなくなります (要素が 1 つ欠落しています)。
これを解決するには、配列サイズを明示的に指定する必要があります。別のパラメータとして渡されます:
void test(int arr[], size_t elems) { int arrSize = elems; /* ... */ } int main() { int point[3] = {50, 30, 12}; /* ... */ test(point, sizeof(point) / sizeof(point[0])); /* ... */ }
sizeof(point)/sizeof(point[0]) はスタックに割り当てられた配列では機能しますが、機能しないことに注意してください。基礎となる減衰メカニズムに依存しているため、動的に割り当てられた配列の場合。
以上が`sizeof` が C 関数の内側と外側で異なる配列サイズを与えるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。