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

C++二维数组传入函数后获取行数异常的问题排查与解决

问题原因分析

1. 行数统计逻辑完全错误

你用while (arr[rowSize][0] != '\0') rowSize++;统计行数的逻辑存在致命问题:

  • 它依赖每一行首字符非'\0'且数组末尾内存恰好有'\0',这完全是不可靠的随机条件。
  • 第一个测试用例中,"found"刚好填满长度为5的行(假设SIZE=5),该行没有多余空间存储'\0'。循环遍历到第4行后,arr[4][0]已是数组外的垃圾内存值,并非'\0',导致循环持续越界读取直到偶然碰到'\0',最终得到错误的rowSize=13。
  • 改成while (arr[rowSize] != NULL)后死循环,是因为arr[rowSize]是指向第rowSize行的指针,只有当该指针地址恰好为0(NULL)时才会终止,而内存中几乎不可能出现这种情况,因此陷入死循环。

2. 列数统计逻辑导致越界与乱码

你用while (arr[i][j] != '\0')统计每行字符数,同样依赖行内存在'\0'。第一个测试用例中部分行无'\0',循环会越界读取垃圾内存数据,最终输出乱码。
第二个测试用例看似正常只是巧合:数组行后的内存恰好存在'\0',让循环提前终止,未触发明显错误。


解决方法

你根本不需要自行统计行数和列数——调用add时已经传入了rows和cols参数,这两个值就是数组的真实维度,直接用它们遍历即可。

修改后的函数如下:

#include <iostream>
#include <string>
using namespace std;

const int SIZE = 5; // 匹配你的测试用例维度

void add(char arr[][SIZE], int rows, int cols, int val){
    int count = 0;
    // 直接用传入的rows和cols遍历数组,避免越界
    for (int i = 0; i < rows; i++){
        for (int j = 0; j < cols; j++){
            // 核心功能:给每个字符的ASCII值加val
            arr[i][j] += val;
            count++;
        }
        // 手动指定输出长度,避免无'\0'导致的乱码
        cout << cols << string(arr[i], cols) << endl;
    }

    // 验证元素总数是否符合预期
    cout << count << endl << rows << endl << rows * cols << endl;
}

int main(){
    char arr[][SIZE] = {"bot  ","rot  ", "found", "low  "};
    add(arr,4,5,5);
    return 0;
}

关键修改点:

  • 移除所有自行统计维度的错误逻辑,直接使用调用者传入的rows和cols,从根源避免越界访问。
  • 打印行时用string(arr[i], cols)手动指定输出长度,解决行内无'\0'导致的乱码问题。
  • 核心功能(ASCII值加val)得到正确实现,元素总数验证也更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 16:25:34