C++代码报int与int**互相无效转换错误,该如何修复?
报错含义说明
你遇到的类型转换报错本质是函数参数声明的类型和实际传入的变量类型不匹配:
- 你在
main函数中定义的arr、solArr都是int**类型(二级指针,对应C++动态二维数组) - 但你声明
isSafe、ratInmaze函数时,数组参数写的是int** arr[],这种写法等价于int*** arr(三级指针),和你传入的二级指针类型完全不匹配,编译器无法完成隐式类型转换,因此抛出无效转换报错。
修复步骤
除了参数类型错误,你的代码还有两处逻辑错误会导致运行结果不对,需要同步修正:
- 第一步:修改两个函数的参数类型,把
int** arr[]改为int** arr,int** solArr[]改为int** solArr,匹配你传入的二级指针类型 - 第二步:修正
isSafe函数的边界判断逻辑,原判断x > n && y > n完全写反,合法的坐标应该满足x >=0 && x <n && y >=0 && y <n - 第三步:修正
ratInmaze函数到达终点的返回值,找到终点后应该返回true而非false,否则路径判断逻辑永远不会触发结果输出
修复后完整代码
#include <iostream> using namespace std; bool isSafe(int** arr, int x, int y, int n) { if (x >= 0 && x < n && y >=0 && y < n && arr[x][y] == 1) { return true; } return false; } bool ratInmaze(int** arr, int x, int y, int n, int** solArr) { if (x == n - 1 && y == n - 1) { solArr[x][y] = 1; return true; } if (isSafe(arr, x, y, n)) { solArr[x][y] = 1; if (ratInmaze(arr, x + 1, y, n, solArr)) { return true; } if (ratInmaze(arr, x, y + 1, n, solArr)) { return true; } solArr[x][y] = 0; return false; } return false; } int main() { int n; cin >> n; int **arr = new int *[n]; for (int i = 0; i < n; i++) { arr[i] = new int[n]; } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> arr[i][j]; } } int **solArr = new int *[n]; for (int i = 0; i < n; i++) { solArr[i] = new int[n]; for (int j = 0; j < n; j++) { solArr[j][i] = 0; } } if (ratInmaze(arr,0,0,n,solArr)) { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout<<solArr[i][j]<<" "; } cout<<endl; } } // 释放动态申请的内存,避免内存泄漏 for(int i=0; i<n; i++){ delete[] arr[i]; delete[] solArr[i]; } delete[] arr; delete[] solArr; return 0; }
内容的提问来源于stack exchange,提问作者divyanshu_31
相关产品推荐
相关产品推荐

