C++は可変長配列(VLA)をサポートしているのか?
C++は可変長配列(VLA)をサポートしているのか?
結論から言うと、C++は可変長配列(Variable Length Array:VLA)を標準規格としてはサポートしていません。C++11以降の標準では、配列のサイズは「定数式(constant-expression)」である必要があると明確に定められています。
そのため、次のように引数で受け取った値を実行時に配列サイズとして使うコードを書いた場合、標準に準拠したコンパイラではコンパイルエラーとなります。
void displayArray(int n) {
int arr[n]; // nは定数式ではないためエラー
// ......
}
int main() {
displayArray(7);
}このプログラムはそのままでは正しく動作しません。
補足:C言語との違い
一方、C言語ではC99規格で可変長配列が正式に採用されており、同じようなコードが有効です。また、GCCなどの一部のコンパイラでは、C++でもコンパイラ拡張としてVLAが使える場合がありますが、これは標準外の機能のため、移植性を重視するコードでは使用を避けるべきです。
代替手段:std::vector を使う
実行時にサイズを決めたい配列が必要な場合は、標準ライブラリの std::vector を利用するのが一般的です。
#include <vector>
void displayArray(int n) {
std::vector<int> arr(n); // 実行時にサイズを指定できる
// ......
}std::vector は要素数を動的に変更でき、メモリ管理も自動的に行われるため、C++で可変サイズの配列が必要な場面では最良の選択肢とされています。
-
C言語の可変長引数(stdarg.h)の使い方をわかりやすく解説
プログラミングをしていると、引数の数をあらかじめ固定せず、呼び出しのたびに異なる個数の引数(パラメータ)を受け取れる関数を作りたい場面に出くわすことがあります。C/C++言語では、このニーズに応える仕組みが標準で用意されており、要件に合わせて可変個の引数を受け取る関数を定義できます。以下に、そのような関数の定義例を示します。 int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); } ここで注目すべきは、関数 func() の最後の引数が省略記号(エリプシス
-
C/C++の多次元配列とは?基本概念から動的メモリ確保まで徹底解説
C/C++における多次元配列とは、簡単に言えば「配列の配列」として定義されるデータ構造です。多次元配列では、データが表形式(行優先順/row-major order)でメモリ上に格納されます。 以下の図は、3×3×3の次元を持つ多次元配列のメモリ割り当て戦略を示したものです。 アルゴリズム 2次元配列を動的に確保し、操作するための基本的な手順は以下の通りです。 Begin 配列の次元を宣言する new演算子を使用して2次元配列 a[][] を動的に確保する 配列に要素を格納する 配列の内容を出力する deleteによってメモリを解放する End サン