2017-01-09 10 views
-7

なぜこのコードは、ユーザーによる配列入力のサイズが8であるときに、ユーザーが10の整数を入力するのを待つのですか?単純な挿入ソートのセグメンテーションフォルト?

ここ
int x, a[x]; 
cout<<"enter the size of array"<<endl; 
cin>>x; 

、あなたは配列aを宣言するとき、それはxに格納された値を使用してサイズ:10の整数問題は、これらの行にある

#include <iostream> 
using namespace std; 
int main() 
{ 
    int x, a[x]; 
    cout << "enter the size of array" << endl; 
    cin >> x; 
    cout << "enter the elements" << endl; 
    for (int j = 0; j < x; j++) 
     cin >> a[j]; 
    for (int i = 1; i < x; i++) { 
     for (int k = 0; k < i; k++) { 
      if (a[i] < a[k]) 
       swap(a[i], a[k]); 
      else 
       continue; 
     } 
    } 
    for (int m = 0; m < x; m++) 
     cout << a[m]; 
} 
+5

'a [x]'を宣言しているので、前に 'x'の値... – Alnitak

+2

私はいつも最高のコンパイラ警告スイッチを使用すると言う.... –

答えて

4

used.`ているとき、それはセグメンテーションフォールトを与えます。しかし、この時点ではxに値を与えていないので、ガベージ・サイズの配列が得られます。後でxを読むと、遡って配列のサイズが変更されることはありません(同じポイントで変数を変更しても、その値に基づいて他の変数が遡及的に変更されないのと同じ方法)ので、配列のサイズは読み込み値と一致しません。さらに、配列が大きすぎると、スタックをオーバーフローさせてしまうこともあります。

これを修正するには、生の配列ではなくstd::vectorのようなものを使用することを検討してください。 (注:可変長配列はC++ではサポートされていないので、std::vectorを使用すると移植性が向上します)

関連する問題