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++中给函数传递动态二维数组有两种常用方式:
- 用二级指针
int**作为参数,和上面的代码写法一致:先分配n个int*类型的行指针,每个行指针再分配m个int元素,直接把二级指针变量传给函数即可。 - 如果是编译期就确定行列大小的二维数组,可以用
int arr[][固定列数]作为参数,但这种方式不支持动态输入行列的场景,适配性差。
内容的提问来源于stack exchange,提问作者Dias Merekeev
相关产品推荐
相关产品推荐

