6

数日前、インターネットから2D割り当てメモリ配列を作成する方法を学びましたが、これは完璧に機能します。配列にアクセスするには、単に使用しますが、入力や他のメソッドの代わりに表記法をmatrix[i][j]使用して、この2D配列を逆参照できる方法はありますか?*[]

最初の質問は解決されました私は使用できます*(*(matrix + i) + j)

別の質問があります。最後のコードセグメントは、割り当てられたメモリを解放することです(インターネットからも取得しました)が、理解できません。なぜ使用できないのdelete [] matrixですか?

int **matrix;

// dynamically allocate an array
matrix = new int *[row]; 
for (int count = 0; count < row; count++)
{
    matrix[count] = new int[col];
}

// input element for matrix
cout << endl << "Now enter the element for the matrix..."; 
for (int i=0; i < row; i++) 
{
    for (int j=0; j < col; j++)
    {
        cout << endl << "Row " << (i+1) << " Col " << (j+1) << " :";
        cin >> matrix[i][j]; // is there any equivalent declaration here?
    }
}

// free dynamically allocated memory
for( int i = 0 ; i < *row ; i++ )
{
    delete [] matrix[i] ;   
}
delete [] matrix ;
4

5 に答える 5

6

2 番目の質問への回答: 次のコードで 2D 配列を割り当てる場合

// dynamically allocate an array
    matrix = new int *[row]; 
    for (int count = 0; count < row; count++)
        matrix[count] = new int[col];

実際には、ポインターの1つの配列(ダブルポインターであるマトリックス変数)と整数の「行」配列(それぞれがマトリックス内の1行を表し、サイズ「col」)を割り当てています。これらは、、matrix[0]などmatrix[1]です。までmatrix[row-1]

したがって、行列を解放する場合は、最初にすべての行 (ループ内で割り当てられた配列) を解放し、次に行を保持していた配列を解放する必要があります。あなたの場合、マトリックスを解放するために使用するコードは部分的に間違っており、次のようになります。

// free dynamically allocated memory
for( int i = 0 ; i < row ; i++ )
{
    //first we delete each row
    delete [] matrix[i] ;
}
//finally, we delete the array of pointers
delete [] matrix ;

ループ内の削除は行列の各行を解放し、最後の削除は行の配列を解放します。コードではrow、ダブル ポインター ( matrix) で削除時間を使用していますが、これは意味がありません。

最後に、ダブル ポインターで単一の削除を使用するのは間違っています。これは、各行に割り当てられたメモリを解放せず、それを参照するポインターのみを解放するため、メモリ リークが発生するためです。

于 2013-02-12T14:04:16.167 に答える
3

もちろん、これを行うことができa[b]ます*(a + b)

*(*(matrix + i) + j)

とにかく、これらのnew割り当てはエラーが発生しやすいものです。ネストされたnews のいずれかがスローされると、リークが発生します。std::vector代わりに使用してみてください。

于 2013-02-12T09:20:29.747 に答える
2

次のようなものが機能します。

int **matrix;

// dynamically allocate an array
matrix = new (std::nothrow) int *[row];
if (matrix == NULL)
{
      // handle the error
}
for (int count = 0; count < row; count++)
{
    *(matrix + count) = new (std::nothrow) int[col];
    if (matrix[count] == NULL)
    {
          // handle the error
    }
 }

cout << "\nNow enter the element for the matrix..."; 
for (int i=0; i < row; i++)
{
    for (int j=0; j < col; j++)
    {
        cout << "\nRow " << (i+1) << " Col " << (j+1) << " :";
        cin >> *(*(matrix + i) + j);
    }
}
于 2013-02-12T09:25:29.327 に答える
1

はい、ポインターの追加を使用しますが、メモリがどのように配置されているかを理解する必要があります。x が int の配列の最初の要素へのポインタであるとします。x[2] にアクセスする場合は、*(x+2) を使用できます。ただし、マトリックスを使用すると非常に混乱する可能性があり、これを行うとマトリックス内の間違ったインデックスにアクセスする可能性が高くなるため、お勧めしません。

于 2013-02-12T09:22:34.023 に答える
0

できます*(*(matrix+i)+j)。括弧表記に相当するはずです。両方の表記法で起こっていることは、単純なポインター演算です。

于 2013-02-12T09:21:53.337 に答える