C++矩阵转置报错:int (*)[2]类型与int **参数不兼容
问题分析与解决
错误原因
你传入的int a[3][2]是固定大小的二维数组,它的类型是int (*)[2](指向包含2个int元素的一维数组的指针),而trans函数的参数要求是int**(指向int指针的指针),这两种类型不兼容:
- 二维数组在内存中是连续的整块存储;
int**指向的是一个指针数组,每个指针对应独立的int数组,内存布局不连续。
另外原代码存在内存分配错误:转置后的矩阵是c行r列,但你只分配了r个指针,且未给每个指针分配对应的int数组,直接赋值会触发未定义行为。
解决方案1:修改函数参数适配固定列数的二维数组
直接调整函数参数类型匹配二维数组,同时修正内存分配逻辑:
#include <iostream> using namespace std; // 参数改为指向含2个int的数组的指针,对应原数组的列数 int** trans(int (*arr)[2], int r, int c) { // 转置后是c行,分配c个指针 int** transpose = new int*[c]; // 为每行分配r个int的空间 for (int i = 0; i < c; ++i) { transpose[i] = new int[r]; } // 完成转置赋值 for (int i = 0; i < r; ++i) { for (int j = 0; j < c; ++j) { transpose[j][i] = arr[i][j]; } } return transpose; } int main() { int r = 3, c = 2, i, j; int a[3][2] = {{1, 2}, {3, 4}, {5, 6}}; int** ans = trans(a, r, c); // 输出转置后的矩阵(c行r列) for (i = 0; i < c; ++i) { for (j = 0; j < r; ++j) cout << ans[i][j] << " "; cout << endl; } // 手动释放动态分配的内存,避免内存泄漏 for (int i = 0; i < c; ++i) { delete[] ans[i]; } delete[] ans; return 0; }
解决方案2:用模板实现通用二维数组转置
如果需要支持任意行列的二维数组,可以用模板函数自动推导数组尺寸:
#include <iostream> using namespace std; // 模板参数R是原数组行数,C是原数组列数 template<int R, int C> int** trans(int (&arr)[R][C]) { int** transpose = new int*[C]; for (int i = 0; i < C; ++i) { transpose[i] = new int[R]; } for (int i = 0; i < R; ++i) { for (int j = 0; j < C; ++j) { transpose[j][i] = arr[i][j]; } } return transpose; } int main() { int a[3][2] = {{1, 2}, {3, 4}, {5, 6}}; int** ans = trans(a); // 转置后是2行3列 for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) cout << ans[i][j] << " "; cout << endl; } // 释放内存 for (int i = 0; i < 2; ++i) { delete[] ans[i]; } delete[] ans; return 0; }
内容的提问来源于stack exchange,提问作者krish
相关产品推荐
相关产品推荐

