ホームページ > バックエンド開発 > C++ > `sizeof` が C 関数の内側と外側で異なる配列サイズを与えるのはなぜですか?

`sizeof` が C 関数の内側と外側で異なる配列サイズを与えるのはなぜですか?

Susan Sarandon
リリース: 2024-12-19 10:51:09
オリジナル
866 人が閲覧しました

Why Does `sizeof` Give Different Array Sizes Inside and Outside a C Function?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート