6

次のようなコードが表示されます。

int foo()
{
  int sz = call_other_func();
  char array[sz];

  /* whatever */
}

これがどのように機能し、gcc. 配列のサイズは静的であり、コンパイル時に決定されるはずですよね?

4

3 に答える 3

4

このタイプの配列は可変長配列と呼ばれ(可変長配列- GCCも参照してください)、C99 でのみ使用できます。VLA を使用すると、配列のサイズを実行時に決定できます。

于 2013-11-20T12:41:57.780 に答える
4

「プログラミングでは、可変長配列 (または VLA) は、(コンパイル時ではなく) 実行時に長さが決定される自動ストレージ期間の配列データ構造です。」(ウィキペディア)

これらは C99 (およびその後 C11) でサポートされています。

それがどのように機能するかについてもっと読む: The New C: Why Variable-length Arrays?

于 2013-11-20T12:44:16.793 に答える
3

これは、可変長配列( VLA )と呼ばれる有効な C99 機能です。コンパイルするとgcc -std=c90 -pedantic、次の警告が表示されます。

警告: ISO C90 は可変長配列 'array' を禁止しています [-Wvla]

を使用して-std=c99 -pedanticも警告は表示されませんが、と はC99モード以外のVLAgccclangサポートし、 VLA拡張子として許可しないC++でもサポートします。

C99 ドラフト標準セクション6.7.5.2 Array declaratorsパラグラフ4からわかるように(強調鉱山):

サイズが存在しない場合、配列型は不完全型です。サイズが式ではなく * である場合、配列型は未指定のサイズの可変長配列型であり、関数プロトタイプ スコープの宣言でのみ使用できます; 124) それでも、そのような配列は完全な型です。サイズが整数定数式で、要素の型に既知の定数サイズがある場合、配列型は可変長配列型ではありません。それ以外の場合、配列タイプは可変長配列タイプです。

Visual Studio は現在 C99 をサポートしていますが、 VLA をサポートしていないことに注意してください。

于 2013-11-20T12:51:22.210 に答える