如何在C++中声明动态二维整数数组

How to declare dynamic 2D integer array in C++

本文关键字:二维 数组 整数 动态 C++ 声明      更新时间:2023-10-16

我有一个要求,我需要从用户那里获取输入,并根据数组的输入长度来决定。例如

int row, column;    
cin>> row>>column;    
int matrix[row][column];    

但是int matrix[row][column]不起作用,因为编译器给出错误说

"Expression must have a constant value"

另外,如果有人可以指导我如何将matrix[row][column]地址分配给指针。我知道如何使用静态数组而不是动态数组来做到这一点。

要声明 2d 动态数组,您将需要指针的指针

int row, column;    
cin>> row>>column;    
int** matrix = new int*[row];
for(int i = 0; i < row; ++i)
    matrix[i] = new int[column];

这是因为数组在 c++ 中是静态的,并且在内存中占据固定位置。假设数组有 1000 个元素。 当您声明静态数组时,这意味着内存中有 1000 个位置彼此为数组保留。如果你想在数组中添加更多的项目,你会在保留数组的末尾添加这个项目,但如果该位置有一些数组以外的数据,这些数据将被删除!!

但是当你把它声明为指针时,你不会存储嵌套在内存中的元素,而是将它们存储在不同的位置,每个位置都存储在指针数组中,当你向数组添加新元素时,编译器会在内存中搜索空位置,并将新元素存储在那里。

使用 2D 数组来保存矩阵是一个坏主意 - 特别是因为内存分配的循环。使用大小行 * 列的 1D 数组并使用 y * 列+x 访问元素,并将其存储在内部并unique_ptr以避免公共内存管理问题。

这是我的建议:

uint32_t rows, cols;
std::cin >> rows >> cols; // Check rows and cols are actually numbers
std::unique_ptr<int[]> matrix(new int[rows*cols]);