可変長配列 (C99 の機能) は自動ストレージ期間の配列であって、その長さは実 行時に決定されます。
可変長配列宣言子の構文 >>-array_identifier--[--+-expression-------------+--]---------->< '-+-----------------+--*-' '-type-qualifiers-'
可変長配列のサイズが式ではなく * で示されている場合は、その配列のサイズは指定されていないものと見なされます。 このような配列は完全型と見なされますが、関数プロトタイプ・スコープの宣言の中でしか使用できません。
可変長配列および可変長配列を指すポインターは、 可変変更型 と見なされます。 可変変更型の宣言は、ブロック・スコープまたは関数プロトタイプ・スコープになけ ればなりません。 extern ストレージ・クラス指定子を宣言される配列オブジェクトは、 可変長配列型であってはなりません。 static ストレージ・クラス指定子で宣言された配列オブジェクトは、可変長配列を指すポインターになることができますが、実際の可変長配列になることはできません。可変長配列は初期化することはできません。
可変長配列は、sizeof 式のオペランドとして使用できます。 この場合は、オペランドは実行時に評価されます。したがって、可変長配列の各インスタンスのサイズがその存続期間中に変化しなかったとしても、そのサイズは整数定数でも定数式でもありません。
可変長配列は typedef ステートメントの中で使用できます。typedef 名は、ブロック・スコープだけを持ちます。 配列の長さは、typedef 名が定義されたときに固定されるのであって、 それが使用されるたびに固定されるのではありません。
void f(int x, int a[][x]);
この場合、可変長配列引数のサイズは、関数定義のサイズと一致していなければなりません。C++ の拡張では、可変長配列型への参照のサポートは組み込まれておらず、関数仮パラメーターを、可変長配列型への参照にすることもできません。