ホームページ >バックエンド開発 >C++ >C 関数に配列を渡すときに「sizeof」が間違った配列サイズを返すのはなぜですか?

C 関数に配列を渡すときに「sizeof」が間違った配列サイズを返すのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-14 15:35:16861ブラウズ

Why Does `sizeof` Return an Incorrect Array Size When Passing an Array to a C Function?

関数に渡すときの配列サイズの不一致

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。