2017-02-11 2 views
1

次の2つの番組セグメントを見てください:今アレイランタイムで宣言とコンパイル時間

int a,b; 
    cin>>a>>b; 
    int arr1[a*b]; 
    int arr2[a]; 

をiが '= 100000と「B」= 5の入力値を与える場合は、プログラムは、実行時エラー理由を示しますメモリオーバーフローの私は思う。今コードの他のセグメントに見える:上記のコードに示すように、私は同じサイズの配列を宣言するとき

int arr1[500000]; 
    int arr2[100000]; 

は今、プログラムが正常に動作します。どうしてこんなことに?

+2

可変長配列はC++でサポートされていません:あなたは実行時に割り当てられ、そのようなことをする必要がある場合は

は、慣用的なC++の方法は、std::vector使用することです。 – haccks

+2

@ haccksが言ったこと。 Cスタイルの配列と 'std :: array'サイズはコンパイル時に知っておかなければなりません。 'std :: vector'を使うか、配列を動的に割り当てることができます。 – Gambit

+2

* "メモリオーバーフローのため実行時エラーが表示される"と思う "* - エラーメッセージを言い換えないでください。それを質問に追加するには、コピー&ペーストを使用します。 –

答えて

1

私は、実行時に宣言した同じサイズの事前に配列を宣言するとき今、プログラムが正常に動作します。どうしてこんなことに?

可変長配列(別名VLAs)は有効な標準のC++コードではないためです。

int a,b; 
cin>>a>>b; 
std::vector<int> arr1(a*b); 
std::vector<int> arr2(a); 
+0

私はここで可変サイズの配列を使用していません。要点は、両方のプログラムセグメントサイズが同じであることです。しかし、最初のセグメントはエラーを示しますが、2番目のセグメントはエラーを示していません。 –

+0

@ShivaVerma _ "最初のセグメントはエラーを示しています" _実際にはVLAであり、標準のC++ではサポートされていません。 –

+0

* "ここで可変サイズの配列を使用していません。" * - はい、あります。 VLAを拡張として受け入れるg ++を使用する可能性は非常に高いです。正しいコンパイラフラグを指定すると、警告メッセージも出力されます。みんながあなたに伝えて 'std :: vector'を使ってください。 –

関連する問題