锯齿数组出现垃圾值问题求助:基于含-111的数组确定维度
锯齿数组出现垃圾值的原因及修复方案
核心问题分析
- 未复制原数组数据:你只给
jagArr分配了内存,但完全没有把原数组arr2的元素复制进去。C++中new分配的内存是未初始化的,里面全是随机垃圾值,直接输出自然会显示乱码。 - 重复分配内存导致泄漏:代码里两次给
jagArr[i]分配内存,第二次循环还重复10次,之前分配的内存地址被覆盖,直接造成内存泄漏,完全没必要。 - 列数计算逻辑错误:原代码遍历每行所有列时,每次循环都会更新
numbers[i],最后numbers[i]只会保留最后一列的计算结果,根本没法正确识别行中是否存在-111。比如某行前几列有-111,但后面列没有,最后numbers[i]会被覆盖成c,不符合你“遇到-111就用该位置作为列数,没遇到就新增-111”的需求。
修复后的代码
int jaggedArr(int** arr2, int r, int c) { int* numbers = new int[r]; /// 存储每行的列数 int** jagArr = new int*[r]; /// 锯齿数组 for (int i = 0; i < r; i++) { int hasMarker = 0; // 先遍历当前行,查找是否存在-111 for (int j = 0; j < c; j++) { if (arr2[i][j] == -111) { numbers[i] = j + 1; // 包含-111本身,列数为j+1 hasMarker = 1; break; // 找到标记就停止遍历 } } // 若未找到-111,列数设为c+1(要新增一个位置存-111) if (!hasMarker) { numbers[i] = c + 1; } } // 为锯齿数组的每行分配对应大小的内存 for (int i = 0; i < r; i++) { jagArr[i] = new int[numbers[i]]; } // 将原数组数据复制到锯齿数组,必要时添加-111 for (int i = 0; i < r; i++) { int j; // 复制原数组内容,遇到-111就停止 for (j = 0; j < c; j++) { jagArr[i][j] = arr2[i][j]; if (arr2[i][j] == -111) { break; } } // 如果原行遍历完都没找到-111,在末尾添加 if (j == c) { jagArr[i][c] = -111; } } cout << "Showing all the Inputed data in a matrix form" << endl; for (int i = 0; i < r; i++) { for (int j = 0; j < numbers[i]; j++) { // 可根据需要恢复格式化输出逻辑 cout << jagArr[i][j]; if (j != numbers[i]-1) cout << " |"; } cout << "\n"; } // 释放动态分配的内存,避免内存泄漏 for (int i = 0; i < r; i++) { delete[] jagArr[i]; } delete[] jagArr; delete[] numbers; return **arr2; }
内容的提问来源于stack exchange,提问作者Ahmad Bilal
相关产品推荐
相关产品推荐

