2017-09-01 7 views
-2

私はなぜ配列のサイズを動的に例

int n; 

cin>>n; 
int arr[n]; 

作品を理解するトラブルを抱えた初期化。私は 'n'の値は実行時にしか宣言できず、したがってコンパイルすべきではないので、このコードは実行しないと言われました。私はまた、私の 'n'変数は一定でなければならないと言われました。 「cin >>」(定数に収まる方法を理解するのに問題があるIm)があるとき、どうやって定数を作るのですか。コードはかなりシンプルですが、私が話したことのために矛盾しています。 C++標準に従って

+8

VLAはC++標準に準拠していません。実際に必要なのは 'std :: vector arr(n);'です。 – user0042

答えて

0

([dcl.array])Dフォーム

D1 [定数式 OPT] 属性指定子を有する宣言TDにおいて

ARの大きオプト -seq rayは一定でなければならない(または適切なイニシャライザで指定しない)。

しかし、コンパイラの開発者の中には、プログラマの便宜のために、C++でCコードをコンパイルする能力を維持するためにVLA(Variable Length Arrays)を使用することを選択した人がいます(CではVLAがC99標準から許可されています)彼らが世界を征服した後でしか学ぶことができません。

ベスト標準に準拠した解決策は、use a std::vectorです。割り当てのサイズをコンパイル時に知ることができない場合です。

int n; 

if (cin>>n) // don't allocate unless n is valid 
{ 
    vector<int> arr(n); 
    // use arr 
} 

VLAが利用可能であっても、vectorは依然としてより安全な解決策です。 vectorはダイナミックストレージから割り当てられることが多く、自動ストレージよりもはるかに大きなデータストアであることが多く、割り当てに失敗すると例外がスローされます。ストレージには大きすぎる可変長配列の動作は定義されていないことが多く、スタック(自動ストレージの一般的な形式)がオーバーフローして、ミステリーバグが多発します。

生メモリをnewで割り当てることは、追加の管理(ある時点で手作業で削除する必要があります)とブック管理(割り当てのサイズはポインタでは分かりません)の責任を取り除くので避けてください。プログラマも今やアドレスしなければならないかもしれないThe Rules of Three and Five.

0

人々は配列をもはや使用せず、ベクトルやリストを使用するので、それらのサイジングについて心配する必要はなく、データを処理するのに利用できる便利な機能がありますそれら。