0

2 次元配列を動的に割り当てる必要がある宿題があり、配列が 2x8 のように長くて細い場合にセグ フォールトが発生し、特定の値が配列にある場合にのみ問題が発生します。これは、配列を作成してから削除するための私のコードです。

int main()
{
  int **p;
  int w, h;

  cin >> w >> h;

  p= new int *[w];
  for (int k=0; k<w; k++)
    p[k]= new int[h];
  for (int i=0; i<h; i++)
  {
    for(int k=0; k<w; k++)
    {
      cin >> p[i][k];
    }
  }


  for (int k=0; k < w; k++)
    delete []p[k];
  delete []p;
  return 0;
}

example input that causes seg fault: 
8 2
5 4 2 3 0 1 2 5
2 0 1 0 9 6 3 2

gdb を使用すると、ループ内の最初の削除の直後にセグメンテーション違反が発生していることがわかりました。

4

2 に答える 2

0

値を代入するためのループは、境界が入れ替わっています。

plength の配列が与えられますが、ループアップするwイテレータがインデックス付けに使用されます。ih

p= new int *[w];

....

cin >> p[i][k];

p[i][k]は として読み取られp[i]、 によって索引付けされ[k]ます。

于 2013-09-01T04:33:47.117 に答える
0

インデックスを混同しました。wポインターを割り当てますが、ループは要素をi通過します。h

于 2013-09-01T04:30:18.487 に答える