【问题标题】:dynamical 2d array: int (*ptr)[4] = new int[7][4];动态二维数组:int (*ptr)[4] = new int[7][4];
【发布时间】:2016-02-13 00:52:27
【问题描述】:

据我所知,动态分配的二维数组应该是这样分配的:

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 的内存泄漏。)

【问题讨论】:

标签: c++ arrays heap-memory


【解决方案1】:

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] 等方式访问元素。

【讨论】:

    【解决方案2】:

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

    当行中的列数不同时,您将需要它。假设您有一个看起来像这样的二维数组:

    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];
    

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 2021-06-18
      • 2018-03-14
      • 2022-01-15
      • 1970-01-01
      • 2015-07-09
      • 2012-09-21
      • 1970-01-01
      • 2020-07-19
      相关资源
      最近更新 更多