动态2d数组:int(*ptr)[4]=new int[7][4];

dynamical 2d array: int (*ptr)[4] = new int[7][4];

本文关键字:int new ptr 数组 2d 动态      更新时间:2023-10-16

据我所知,动态分配的2d数组应该这样分配:

int **rows = new int*[7]; 
//for loop assigning all seven rows[i] a "new int[4]"

然而,以下内容也适用于我:

int (*ptr)[4] = new int[7][4];  //create dynamic 2d array
for(int i = 0; i < 7; ++i)      //initialize and test
{    
    for(int j = 0; j < 4; ++j)
    {
        ptr[i][j] = i + j;
        cout << ptr[i][j] << ' ';
    }
    cout << endl;
}
delete[] ptr;
 /* 
output: 
0 1 2 3 
1 2 3 4 
2 3 4 5 
3 4 5 6 
4 5 6 7 
5 6 7 8 
6 7 8 9 
*/

为什么我要使用我首先提到的更复杂的方法,当我可以用这一行创建一个动态二维阵列时:

int (*ptr)[4] = new int[7][4];

我很感激任何见解!

(我使用valgrind没有发现内存泄漏。)

为什么我要使用我首先提到的更复杂的方法,当我可以用这一行创建一个动态二维阵列时:

当行中的列数不同时,您可能需要这样做。假设你有一个2D阵列,看起来像:

1 2 3 4 5 6 7 8 9 10
1 2 3 4
9 8 8 5 6 4

对于这种情况,第二种方法不起作用。您需要使用:

p[0] = new int[10];
p[1] = new int[4];
p[2] = new int[6];

int (*rows)[4]要求4是编译时常数。如果直到运行时才知道列数,则不能使用此方法。

但是,您不应该使用这两种方法。为了编写安全的代码,应该避免使用原始指针。通过使用适当的容器,内存管理就为您完成了,这意味着您的代码是清晰的,不太可能包含错误。

// Neither rows nor columns known at compile-time
std::vector<std::vector<int>> x(7, std::vector<int>(4));
// columns known at compile-time
std::vector<std::array<int, 4>> x(7);

在这两种情况下,您都可以通过x[5][2]等访问元素。