C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++の関数で配列引数のサイズを出力する方法

C++では、データ型のサイズを sizeof() 演算子を使って取得できます。しかし、配列を関数に渡した場合と、定義元のスコープ内で直接サイズを取得した場合では、結果が異なることに注意が必要です。この記事では、関数に渡された配列パラメータのサイズを出力するサンプルプログラムを通じて、その挙動の違いを詳しく解説します。

サンプルコード

#include <iostream>
using namespace std;
int func(int a[]) {
    cout << "Size: " << sizeof(a);
    return 0;
}
int main() {
    int array[5];
    func(array);
    cout << "\nSize: " << sizeof(array);
    return 0;
}

実行結果

上記のプログラムを実行すると、次のような出力が得られます。

Size: 8
Size: 20

プログラムの解説

func() 関数内での sizeof の挙動

func() 関数内では、a のサイズとして「8」が表示されます。これは、main() 内で定義された配列が関数に渡される際、実際には配列の先頭アドレスを指す「ポインタ」として渡されるためです。つまり、sizeof(a) は配列全体のサイズではなく、ポインタ変数自体のサイズ(64ビット環境では8バイト)を返します。該当するコード部分は以下の通りです。

int func(int a[]) {
    cout << "Size: " << sizeof(a);
    return 0;
}

main() 関数内での sizeof の挙動

一方、main() 関数内では、array のサイズとして「20」が表示されます。これは、int 型が4バイトであり、配列には5個の int 要素が含まれているため、4 × 5 = 20 バイトとなるからです。ここでは sizeof(array) が配列そのものに対して適用されているため、正しい合計サイズが取得できます。該当するコード部分は以下の通りです。

int main() {
    int array[5];
    func(array);
    cout << "\nSize: " << sizeof(array);
    return 0;
}

注意点と対策

このように、C++では配列を関数に渡すと自動的にポインタへと「減衰(decay)」するため、関数内で sizeof を使っても元の配列のサイズを取得することはできません。なお、ポインタのサイズは環境によって異なり、64ビットシステムでは8バイト、32ビットシステムでは4バイトになります。

関数内で正確な配列サイズが必要な場合は、以下のような方法が推奨されます。

  • 配列の要素数を別途引数として関数に渡す
  • C++11以降であれば std::arraystd::vector などのコンテナを使用し、size() メソッドで要素数を取得する
  • int (&a)[5] のような参照渡しで配列を渡すことで、sizeof が正しく機能するようにする
  1. C++のnew演算子を使って2次元配列を動的に宣言・生成する方法

    動的な2次元配列とは、基本的に「配列へのポインタ」を要素とする配列(ポインタの配列)のことです。つまり、各行が独立した1次元配列としてヒープ上に確保され、それらの先頭アドレスを格納するポインタ配列によって全体が管理されます。下図は、3×4の2次元配列のイメージです。アルゴリズムC++のnew演算子で2次元配列を動的に確保する手順は以下の通りです。Begin 配列の寸法(行数・列数)を宣言する。 new を使って 2次元配列 a[][] を動的に確保する。 配列に要素を代入する。 配列の内容を出力する。 delete でメモリを解放する。 Endサンプルコ

  2. C++で配列を使う方法!宣言から要素へのアクセスまで徹底解説

    配列(Array)とは、同じ型の要素が連続したメモリ領域上に並んでいるデータ構造で、一意の識別子(変数名)にインデックスを組み合わせることで、個々の要素に個別にアクセスできます。C++で配列を使用するには、まず配列を宣言する必要があります。 int arr[10]; このコードは、int型の要素を10個格納できる配列を宣言しています。これにより、連続したメモリ領域に10個の整数を保存することが可能になります。 配列の要素へアクセスする方法 配列の特定の要素を参照するには、配列アクセス演算子「[]」を使い、アクセスしたい要素のインデックスを指定します。ここで重要なのは、C++の配列のインデックス