可変長配列

可変長配列 (C99 の機能) は自動ストレージ期間の配列であって、その長さは実 行時に決定されます。

構文図を読む構文図をスキップする
 可変長配列宣言子の構文 

>>-array_identifier--[--+-expression-------------+--]----------><
                        '-+-----------------+--*-'      
                          '-type-qualifiers-'           

可変長配列のサイズが式ではなく * で示されている場合は、その配列のサイズは指定されていないものと見なされます。 このような配列は完全型と見なされますが、関数プロトタイプ・スコープの宣言の中でしか使用できません。

可変長配列および可変長配列を指すポインターは、 可変変更型 と見なされます。 可変変更型の宣言は、ブロック・スコープまたは関数プロトタイプ・スコープになけ ればなりません。 extern ストレージ・クラス指定子を宣言される配列オブジェクトは、 可変長配列型であってはなりません。 static ストレージ・クラス指定子で宣言された配列オブジェクトは、可変長配列を指すポインターになることができますが、実際の可変長配列になることはできません。可変長配列は初期化することはできません。

注: C++ アプリケーションでは、可変長配列によって使用するように割り振られたストレージは、可変長配列が使用されている関数の実行が完了するまで解放されません。

可変長配列は、sizeof 式のオペランドとして使用できます。 この場合は、オペランドは実行時に評価されます。したがって、可変長配列の各インスタンスのサイズがその存続期間中に変化しなかったとしても、そのサイズは整数定数でも定数式でもありません。

可変長配列は typedef ステートメントの中で使用できます。typedef 名は、ブロック・スコープだけを持ちます。 配列の長さは、typedef 名が定義されたときに固定されるのであって、 それが使用されるたびに固定されるのではありません。

関数仮パラメーターは可変長配列となることができます。 必要なサイズ式は、関数定義の中で指定する必要があります。 コンパイラーは、関数に入るときに、変更されたパラメーターのサイズ式を評価します。 以下のように、関数が可変長配列をパラメーターとして宣言されているとします。
void f(int x, int a[][x]);
この場合、可変長配列引数のサイズは、関数定義のサイズと一致していなければなりません。

C++ の拡張では、可変長配列型への参照のサポートは組み込まれておらず、関数仮パラメーターを、可変長配列型への参照にすることもできません。

関連情報