2

C ++で配列を初期化するために次のことを行っています

int a;
cin>>a;
float b[a];

これは私のコンピューターで動作し、コンパイルされます。これは正しいです?a が const int である場合にのみこれを行うことができると思いました。

4

2 に答える 2

1

a が定数 int であるかどうかではありません。これは、コンパイル時に a に初期値が割り当てられているかどうかに関するものです。コンパイラは、値に従ってストレージを割り当てる必要がありconst intます。C++ 標準は現在、可変長配列をサポートしていません。

C99 では、この可変長配列の構文は有効ですが、C++ 標準では無効とされています。これは非常に便利な機能であり、毛むくじゃらのメモリ割り当てをすべてコンパイラに任せます。

GCC と Clang では、この機能はコンパイラ拡張機能としてサポートされているため、警告やエラーは発生しません。しかし、MSVC コンパイラは次のようなエラー メッセージを表示しますcannot allocate an array of constant size 0。したがって、コンパイラ固有です。

この機能をサポートするコンパイラは、new演算子を使用してコードを変換する場合があります。

int a;
cin>>a;
float *b = new float[a];

これは C++ 標準で有効です。

もう1つは、可変長配列と呼ばれていますが、長さがまったく可変ではないことです。定義されると、その長さは変化しない定数値になります。拡大も縮小もできません。

vector真に長さが可変で、スケーラビリティと適応性がはるかに高いコンテナを使用する方がはるかに優れています。

詳細については、なぜ可変長配列が C++ 標準の一部ではないのですか?に関する投稿を参照してください。

于 2013-12-20T15:43:07.667 に答える