配列の動的確保
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/12/13 01:36 UTC 版)
「動的メモリ確保」も参照 前述の例では、プログラム中で宣言時に指定した固定のサイズ(整数定数)による配列確保(静的確保)であった。実用的には、配列の要素数が宣言時(あるいはコンパイル時)に静的に決まってしまうよりも、実行時に要素数を動的に指定して配列を確保できたほうが便利なことがある。例えば、縦横任意サイズの画像ファイルから全画素情報を読み出す場合や、コンピュータで利用可能な空きメモリ量に合わせて扱うデータ個数上限を変化させたい場合などである。 多くのプログラミング言語では、配列のサイズをプログラム実行時に指定して配列を生成する(動的に確保する)手段が用意されている。例えばC言語ではmalloc関数やcalloc関数を利用する。確保に成功するとメモリブロック(配列先頭要素)へのポインタが返却され、このポインタ経由で配列を操作する。 int numStudents;// 例えば標準入力経由でnumStudentsに生徒数 (> 0) を読み込んだとする。int* score = calloc(numStudents, sizeof(int)); // 要素数がnumStudents、各要素のサイズがint型のサイズであるような配列を動的に確保し、0で初期化する。// 例えば標準入力経由で各生徒の得点を配列scoreに読み込んだとする。double mean = 0;for (int i = 0; i < numStudents; ++i) { mean += score[i]; // 動的に確保した場合でも、配列の添え字シンタックスは同じ。}mean /= numStudents;free(score); // 使い終わった配列のメモリ領域を解放する。 C++などの後発の言語では、動的メモリ確保のために通例new演算子が用意されていることが多く、配列の動的確保には型と要素数を指定するnew[]演算子を使用する。 int numStudents;// 例えば標準入力経由でnumStudentsに生徒数 (> 0) を読み込んだとする。int* score = new int[numStudents](); // 要素数がnumStudentsであるようなint型の配列を動的に確保し、0で初期化する。// 例えば標準入力経由で各生徒の得点を配列scoreに読み込んだとする。double mean = 0;for (int i = 0; i < numStudents; ++i) { mean += score[i]; // 動的に確保した場合でも、配列の添え字シンタックスは同じ。}mean /= numStudents;delete[] score; // 使い終わった配列のメモリ領域を解放する。 いずれにせよ、C/C++ではmallocあるいはnewによってヒープ領域から確保したメモリは明示的に解放する必要があり、解放を忘れるとメモリリークの原因となる。プログラミングの煩雑さを解消するため、C++ではコンストラクタ・デストラクタを使ったメモリ寿命管理手法 (RAII) が使われることが多い。Javaなどの後発の言語ではガベージコレクションによる自動解放を導入していることが多く、また配列の確保に関して静的確保・動的確保といった区別をしない(配列の確保はすべて動的確保である)ことが多い。 通例、上記のようにして「動的に確保された配列」は、後述の「動的配列」とは異なり、要素の追加時に自動的にサイズを増加させるようなことはできない。 なお、C言語には後述する可変長配列も言語機能として備わっているが、メモリの生存期間などの面で違いがある。
※この「配列の動的確保」の解説は、「配列」の解説の一部です。
「配列の動的確保」を含む「配列」の記事については、「配列」の概要を参照ください。
- 配列の動的確保のページへのリンク