我想在矩阵中交换两行。我的矩阵是一个分配的固体内存块。 我有一个指针数组,指向矩阵的行。第一个指针指向这个大的已分配块。其他指针指向不同的部分或这个块。
如果我交换任何两行,除了第一行,它就行了。但我的第一行有问题。 我想这是因为指向第一行的指针与其他指针不同。但主要区别是什么?
#include <iostream>
int** allocateMatrix(int rows, int cols) {
// allocating array of pointers (rows)
int** matrix = new int*[rows];
// allocating one solid block for the whole matrix
matrix[0] = new int[rows*cols];
// setting the pointers for rows
for ( int i = 1; i < rows; ++i ) {
matrix[i] = matrix[i-1] + cols;
}
// fill the matrix with consecutive numbers
int k = 1;
for ( int i = 0; i < rows; ++i ) {
for ( int j = 0; j < cols; ++j ) {
matrix[i][j] = k;
k += 1;
}
}
return matrix;
}
void freeMatrix(int** matrix) {
delete[] matrix[0];
delete[] matrix;
}
int main() {
int n = 3;
int m = 3;
int** matrix = allocateMatrix(n, m);
// swap the first and the second line
int* tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
// print matrix (it is printing ok)
for ( int i = 0; i < n; ++i ) {
for ( int j = 0; j < m; ++j ) {
std::cout << matrix[i][j] << ' ';
}
std::cout << std::endl;
}
// problem is here
freeMatrix(matrix);
return 0;
}
答案 0 :(得分:1)
主要区别在于new[]
返回了第一个指针。删除该指针将取消分配整个内存块,但删除数组中的任何其他指针将具有未定义的行为。
你可以分别存储从new[]
得到的指针,并且有一个重复的&#34;弱&#34;指向保存在行指针数组中的第一行的指针。
答案 1 :(得分:0)
如果您交换第一行(0)和第二行(第一行),您的代码将无法正常工作,因为您正在使用matrix[0]
删除内存分配。
你需要以某种方式&#34;保持&#34;原始分配,例如
int *origalloc;
...
origalloc = matrix[0] = new int[rows*cols];
...
delete[] origalloc; // Instead of malloc[0];
您传递给delete
或delete []
的内容必须与您从new
或new []
获得的指针值相同。其他任何事都是未定义的行为。