gpt4 book ai didi

c++ - 用公共(public)指针交换指向已分配内存的指针

转载 作者:行者123 更新时间:2023-11-28 06:40:23 26 4
gpt4 key购买 nike

我想交换矩阵中的两行。我的矩阵是一个分配的固定内存块。我有一个指向矩阵行的指针数组。第一个指针指向这个大的分配 block 。而其他指针指向不同的部分或这个 block 。

如果我交换任意两行,除了第一行,没问题。但我对第一行有疑问。我想那是因为指向第一行的指针与其他指针不同。但主要区别是什么?

#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;
}

最佳答案

主要区别在于第一个指针由 new[] 返回。删除该指针将释放整个内存块,但删除数组中的任何其他指针将产生未定义的行为。

您可以单独存储从 new[] 获得的指针,并在行指针数组中保留指向第一行的重复“弱”指针。

关于c++ - 用公共(public)指针交换指向已分配内存的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26087028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com