2016-04-10 8 views
0

私のコードは次のとおりです。私は入力を与えるとなぜ私のコードにランタイムエラーが発生していますか?

int main() { 
    int t; 
    cin >> t; 
    while(t--){ 

     int ladder,snake,temp,x,y; 
     cin >> ladder; 
     vector<vector<int> >ar(ladder,vector<int>()); 
     for(int i=0;i<ladder;i++){ 
      cin >> x >> y; 
      ar[x].push_back(y); 
     } 
       cin >> snake; 
     for(int i=0;i<snake;i++){ 
      cin >> x >> y; 
      ar[x].push_back(y); 
     } 
    } 
    return 0; 
} 

2 
3 
32 62 
42 68 
12 98 
7 
95 13 
97 25 
93 37 
79 27 
75 19 
49 47 
67 17 
4 
8 52 
6 80 
26 42 
2 72 
9 
51 19 
39 11 
37 29 
81 3 
59 5 
79 23 
53 7 
43 33 
77 21 

実行時エラーがくると悪いメモリ管理を言っています。私のコードで何が間違っていますか?

+1

ベクター> ar(はしご、ベクター());これはどういう意味ですか?それは関数呼び出しか変数 'ar'宣言ですか? –

+0

'ar'は3つの要素で初期化されます。なぜ、' 2'より大きいインデックスの要素にアクセスできるのでしょうか? –

答えて

1

あなたは、データ系列

2 
3 
32 62 

無視する最初の値は、この目的のためにcin >> t缶によって吸収された後、既に問題が表示されます。

第2の値はcin >> ladderに吸収され、結果としてarが3つのintベクトルのベクトルとして割り当てられます。

3行目はcin >> x >> yに吸収され、内側のインデックスにはar[x].push_back(y)が使用されます。 x >= 3のサイズはarなので、未割り当てのメモリに書き込むと、後でクラッシュすることになります。

g++ -D_GLIBCXX_DEBUG -g -Wall test.cppでコンパイルされたコードも出力されます。

/usr/include/c++/4.9/debug/vector:357:error: attempt to subscript container 
    with out-of-bounds index 32, but container only holds 3 elements. 
-3

ヨアヒム・イザクソンは良い答えを提供しますが、それよりも深刻に実行されているようです。何が起こるか把握しながら、私はこの魔法の修正を実行しました。そのようなあなたのメインループを開きます。私は正直に何が起こっているかを伝えることはできませんが、coutに、この1つの呼び出しが私のマシン上でセグメンテーションフォルトからプログラムを停止し

int main() { 
    int t; 
    cout << "This is a fix. Crazy, huh?\n"; 
    cin >> t; 

。すべて。シングル。時間。

+3

境界を書き込むことは、(C++仕様に従って)未定義の動作です。これは、それまでどんな効果もあります。...うまく動作します:)主に、あなたは幸運ではありません。 –

関連する問題