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
相关产品推荐
相关产品推荐

