如何在C++函数中传递二维数组?编译错误求助
解决二维数组传递到search函数的编译错误
嘿,我来帮你搞定这个编译错误,顺便修复代码里的另一个隐藏问题!
错误根源分析
你看到的no matching function for call错误,核心原因是变长数组(VLA)和固定大小数组参数的类型不兼容:
- 你在
main里用了int arr[m][n],这是C99的变长数组特性(并非标准C++,仅GCC等部分编译器支持),它的第二维大小是运行时确定的n。 - 而你的
search函数参数int arr[][N],在C++里会被解析成int (*arr)[100]——也就是指向一个长度为100的int数组的指针。这和你传递的int [m][n]类型完全不匹配,编译器找不到合法的转换方式,所以报错。
另外还有个容易忽略的问题:search函数的部分代码路径没有返回值(比如递归调用时没写return),这会导致未定义行为,必须修复。
推荐修复方案:改用vector(符合标准C++,灵活无限制)
用vector<vector<int>>代替变长数组,既能支持动态大小,又能完美适配函数参数,是现代C++的最佳实践:
#include<bits/stdc++.h> using namespace std; int search(const vector<vector<int>>& arr, int i, int l, int r){ if(r >= l){ int q = (l + r) / 2; // 找到目标位置,返回索引 if(arr[i][q] == 0 && arr[i][q+1] == 1) return q; // 目标在右半部分,递归并返回结果 if(arr[i][q+1] == 0) return search(arr, i, q+1, r); // 目标在左半部分,递归并返回结果 else return search(arr, i, l, q-1); } // 处理边界情况(理论上你的逻辑不会走到这,但加上更安全) return -1; } int main() { int t; cin >> t; while(t--){ int m, n, count, min_val = 41, row = 0; // 别用min当变量名,会和标准库的std::min冲突 cin >> m >> n; // 创建m行n列的二维vector vector<vector<int>> arr(m, vector<int>(n)); for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ cin >> arr[i][j]; } } for(int i = 0; i < m; i++){ if (arr[i][n-1] == 0) count = n; else if(arr[i][0] == 1) count = 0; else count = search(arr, i, 0, n-2); if(count < min_val){ min_val = count; row = i; } } cout << row << endl; } return 0; }
核心修改点:
- 替换变长数组为vector:
vector<vector<int>> arr(m, vector<int>(n))完全符合C++标准,支持任意动态大小,无需提前定义常量。 - 适配函数参数:
search函数参数改为const vector<vector<int>>& arr,直接接收二维vector,类型完全匹配。 - 修复返回值问题:递归调用时必须加上
return,确保所有代码路径都有返回值,避免未定义行为。 - 避免命名冲突:把变量名
min改成min_val,防止和标准库的std::min函数冲突。
备选方案:用模板函数适配固定大小数组
如果你坚持要用数组,可以把search改成模板函数,让它适配任意固定大小的二维数组:
#include<bits/stdc++.h> using namespace std; // 模板参数N表示数组的第二维大小 template<int N> int search(int arr[][N], int i, int l, int r){ if(r >= l){ int q = (l + r) / 2; if(arr[i][q] == 0 && arr[i][q+1] == 1) return q; if(arr[i][q+1] == 0) return search<N>(arr, i, q+1, r); else return search<N>(arr, i, l, q-1); } return -1; } int main() { const int MAX_N = 100; // 提前定义数组的最大列数 int t; cin >> t; while(t--){ int m, n, count, min_val = 41, row = 0; cin >> m >> n; // 用固定大小的数组,n不能超过MAX_N int arr[MAX_N][MAX_N]; for(int i = 0; i < m; i++){ for(int j = 0; j < n; j++){ cin >> arr[i][j]; } } for(int i = 0; i < m; i++){ if (arr[i][n-1] == 0) count = n; else if(arr[i][0] == 1) count = 0; else count = search<MAX_N>(arr, i, 0, n-2); if(count < min_val){ min_val = count; row = i; } } cout << row << endl; } return 0; }
这个方案的缺点是数组大小受限于MAX_N,不如vector灵活,但如果你有明确的大小限制,也可以用。
内容的提问来源于stack exchange,提问作者sharma.37
相关产品推荐
相关产品推荐

