6

几天前,我从互联网上了解到创建 2D 分配的内存阵列,它工作得很好。要访问我们只是简单地使用的数组matrix[i][j],但是有什么方法可以通过使用*符号而不是[]输入以及其他方法来取消引用这个二维数组?

第一个问题已解决,我可以使用*(*(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

回答您的第二个问题:当您使用以下代码分配二维数组时

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

实际上,您正在分配一个指针数组(您的矩阵变量,它是一个双指针)和整数“行”数组(每个代表矩阵中的一行,大小为“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]is just*(a + b)你当然可以这样做:

*(*(matrix + i) + j)

无论如何,这些new分配很容易出错。如果其中一个嵌套new的 s 抛出,那么您将有泄漏。尝试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 回答