You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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; 
} 

核心修改点:

  1. 替换变长数组为vector:vector<vector<int>> arr(m, vector<int>(n))完全符合C++标准,支持任意动态大小,无需提前定义常量。
  2. 适配函数参数:search函数参数改为const vector<vector<int>>& arr,直接接收二维vector,类型完全匹配。
  3. 修复返回值问题:递归调用时必须加上return,确保所有代码路径都有返回值,避免未定义行为。
  4. 避免命名冲突:把变量名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 17:22:26