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

C++传递二维数组到函数出现编译报错,求问题排查及解决方法

错误原因梳理
  • 变量重复定义:main函数中先后声明了两个同名变量table,第一个是栈上的变长数组int table[n][m],第二个是堆上的二级指针int** table,直接触发冲突报错。同时C++标准不支持变长数组(VLA),这类写法依赖编译器扩展,兼容性很差,不建议使用。
  • 堆内存分配语法错误:给二级指针table分配每行内存时,多写了类型声明int,错误写成int table[i] = new int[m],正确写法是直接给table[i]赋值即可。
  • 输入循环边界错误:输入二维数组的内层循环判断条件写为j < n,应该修改为j < m,否则当行列数不一致时会出现越界访问。
  • 函数逻辑完全不符合需求:现有function的代码并没有统计每行的正数个数,存储到numb_posit的数值完全无效,同时遍历numb_posit时存在i+1越界的问题,判断所有行正数相等的逻辑也不成立。
修正后的完整代码
#include <iostream>
using namespace std;

// 函数功能:返回正数最多的行号(从0开始),如果所有行正数个数相等返回-1
int findMaxPositiveRow(int n, int m, int **table) {
    // 先统计每行的正数个数
    int *positiveCount = new int[n]();
    for (int i = 0; i < n; i++) {
        int count = 0;
        for (int j = 0; j < m; j++) {
            if (table[i][j] > 0) {
                count++;
            }
        }
        positiveCount[i] = count;
    }

    // 找最大的正数个数
    int maxCount = -1;
    for (int i = 0; i < n; i++) {
        if (positiveCount[i] > maxCount) {
            maxCount = positiveCount[i];
        }
    }

    // 检查是不是所有行的正数个数都相等
    bool allEqual = true;
    for (int i = 1; i < n; i++) {
        if (positiveCount[i] != positiveCount[0]) {
            allEqual = false;
            break;
        }
    }
    if (allEqual) {
        delete[] positiveCount;
        return -1;
    }

    // 找第一个出现最大正数个数的行号
    int targetRow = -1;
    for (int i = 0; i < n; i++) {
        if (positiveCount[i] == maxCount) {
            targetRow = i;
            break;
        }
    }
    delete[] positiveCount;
    return targetRow;
}

int main() {
    int n, m;
    cin >> n >> m;

    // 只声明一次二级指针对应的二维数组,不要定义栈上的变长数组
    int** table = new int*[n];
    for (int i=0; i<n; i++) {
        table[i] = new int[m];
    }

    // 输入数组元素
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> table[i][j];
        }
    }

    int result = findMaxPositiveRow(n, m, table);
    if (result == -1) {
        cout << "所有行的正数个数相等" << endl;
    } else {
        cout << "正数最多的行是第" << result << "行(行号从0开始)" << endl;
    }

    // 释放堆内存,避免泄漏
    for (int i = 0; i < n; i++) {
        delete[] table[i];
    }
    delete[] table;

    return 0;
}
二维数组传参核心说明

C++中给函数传递动态二维数组有两种常用方式:

  1. 用二级指针int**作为参数,和上面的代码写法一致:先分配n个int*类型的行指针,每个行指针再分配m个int元素,直接把二级指针变量传给函数即可。
  2. 如果是编译期就确定行列大小的二维数组,可以用int arr[][固定列数]作为参数,但这种方式不支持动态输入行列的场景,适配性差。

内容的提问来源于stack exchange,提问作者Dias Merekeev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 15:48:04