次のようなコードが表示されます。
int foo()
{
int sz = call_other_func();
char array[sz];
/* whatever */
}
これがどのように機能し、gcc
. 配列のサイズは静的であり、コンパイル時に決定されるはずですよね?
次のようなコードが表示されます。
int foo()
{
int sz = call_other_func();
char array[sz];
/* whatever */
}
これがどのように機能し、gcc
. 配列のサイズは静的であり、コンパイル時に決定されるはずですよね?
「プログラミングでは、可変長配列 (または VLA) は、(コンパイル時ではなく) 実行時に長さが決定される自動ストレージ期間の配列データ構造です。」(ウィキペディア)
これらは C99 (およびその後 C11) でサポートされています。
それがどのように機能するかについてもっと読む: The New C: Why Variable-length Arrays?
これは、可変長配列( VLA )と呼ばれる有効な C99 機能です。コンパイルするとgcc -std=c90 -pedantic
、次の警告が表示されます。
警告: ISO C90 は可変長配列 'array' を禁止しています [-Wvla]
を使用して-std=c99 -pedantic
も警告は表示されませんが、と はC99モード以外のVLAgcc
をclang
サポートし、 VLAを拡張子として許可しないC++でもサポートします。
C99 ドラフト標準セクション6.7.5.2
Array declaratorsパラグラフ4からわかるように(強調鉱山):
サイズが存在しない場合、配列型は不完全型です。サイズが式ではなく * である場合、配列型は未指定のサイズの可変長配列型であり、関数プロトタイプ スコープの宣言でのみ使用できます; 124) それでも、そのような配列は完全な型です。サイズが整数定数式で、要素の型に既知の定数サイズがある場合、配列型は可変長配列型ではありません。それ以外の場合、配列タイプは可変長配列タイプです。
Visual Studio は現在 C99 をサポートしていますが、 VLA をサポートしていないことに注意してください。