7

これはC言語で有効ですか?

#include <stdio.h>
int main()
{
  int i = 5;
  int a[i];     // Compiler doesn't give error here. Why?
  printf("%d",sizeof(a));  //prints 5 * 4 =20. 4 is the size of integer datatype.
  return 0;
}

コンパイラはステートメントでエラーを出しませんint a[i];。i は定数ではありませんが、どうすれば正常にコンパイルできますか? gccコンパイラを使用しているからですか?C++で許可されていますか?

4

4 に答える 4

17

はい、これはC99の時点で有効であり、可変長配列(VLA)と呼ばれます。つまり、約 14 年間、公用語の標準になっています。

いいえ、C++ では有効ではありません。詳細については、この質問を参照してください。

また、は関数ではないため、値に適切な書式指定子を使用するsizeofように記述できることにも注意してください。printf("%zu\n", sizeof a);size_t

于 2013-10-02T11:00:01.670 に答える
2

これは有効なC99で、可変長配列( VLA )と呼ばれgccます。これは実際にはC99の機能ですが、 gccとclangの両方可変長配列を拡張としてサポートしいます。

-pedantic引数 ingccを使用してビルドできます。clang両方とも、次のような警告が表示されます。

warning: variable length arrays are a C99 feature [-Wvla-extension]

sizeof整数定数の代わりに評価されますが、 VLAで正しく動作することが期待されます。isと notに対して間違った書式指定子を指定したため、コードには未定義の動作がありますが。セクションのC99 ドラフト標準のセクションがフォーマット文字列の段落9について参照する fprintf 関数は、次のように述べています。size_tzud7.19.6.1 printf

変換指定が無効な場合、動作は未定義です。[...]

于 2013-10-02T11:41:51.783 に答える
0

C ++ 14では、VLAとほぼ同じように機能するランタイムサイズの配列が存在するというアンワインドの回答に追加します。

N3690の 8.3.4 章を参照してください( array of runtime bound of T)

これらは clang-3.3 (C++1y モード) でサポートされているようですが、GCC 4.8 ではサポートされていません (GCC 4.9 でサポートされるはずです)。C++14 以前のモード (c++03、c++11) でコードを記述した場合、コードはおそらくコンパイルされますが、C++ でサポートされていない C99 機能の使用に関する警告が発行されるはずです。

そして、常にほとんどのペダンティックな警告を有効にしてコンパイルする必要があります:)

于 2013-10-02T11:38:58.983 に答える