0

ケース1:

int nrows=5;
int ncols=10;
int **rowptr;
rowptr=new int*;
for(int rows=0;rows<nrows;rows++) {
  for(int cols=0;cols<ncols;cols++) {
    *rowptr=new int;
  }
}

ケース2:

int nrows=5;
int ncols=10;
int **rowptr;
for(int rows=0;rows<nrows;rows++) {
  rowptr=new int*;
  for(int cols=0;cols<ncols;cols++) {
    *rowptr=new int;
  }
}

両方の方法を使用して値を挿入および出力できます。初期化の違いは何ですか?

4

3 に答える 3

2

違いはなんですか?

#1整数ポインタの配列ではなく、整数ポインタを保持するのに十分なメモリを割り当てるだけです。
#2前の反復のメモリ割り当てを上書きするだけで、メモリリークが発生します。

両方の方法を使用して値を挿入および印刷できます

メモリリークと未定義動作は、プログラムですぐに誤った結果を観察することはないかもしれませんが、マーフィーの法則の良い例であることは確かです。

これを行う正しい方法は次のとおりです。

int nrows = 5;
int ncols = 10;

//Allocate enough memory for an array of integer pointers
int **rowptr = new int*[nrows]; 

//loop through the array and create the second dimension
for (int i = 0;i < nrows;i++)
    rowptr[i] = new int[ncols];
于 2012-09-14T11:21:46.540 に答える
1

どちらの場合もメモリ リークが発生します。

このような「2d」配列を初期化する適切な方法は次のとおりです。

int** arr = new int*[nrows];
for (int i = 0; i < nrows; i++)
   arr[i] = new int[ncols];

ただし、C/C++ で定義されている 2 次元配列ではないことに注意してください。メモリ内で連続していない可能性があり、おそらく連続していない可能性があります。また、メンバーにアクセスするためのアセンブリ コードも異なります。

あなたの場合、インデックス作成によるアクセスは次と同等です*(*(arr+i)+j)

2 次元配列の*(arr + N_COLS*i + j)場合N_COLSは、コンパイル時の定数です。

真の 2 次元配列が必要な場合は、次のようにする必要があります。

int (*arr)[N_COLS] = (int(*)[N_COLS])(new int[N_ROWS * N_COLS])
于 2012-09-14T11:23:17.127 に答える
0

2Dアレイの管理には1Dアレイを使用することをお勧めします

int **x = new int*[nrows];
x[0] = new int[nrows*ncols];
for (int i = 1; i < nrows; i++)
    x[i] = x[i-1] + ncols;

for (int i = 0; i < nrows; i++)
    for (int j = 0; j < ncols; j++)
        x[i][j] = 0;

delete [] x[0];
delete [] x;
于 2012-09-14T12:16:29.523 に答える