合并两个有序数组程序输出异常,请求代码问题排查与修改指导
合并有序数组出现垃圾值的常见修正点
以下是这类问题最常出现的几个错误位置及修正方案:
未初始化合并数组
局部数组默认会保留内存中的随机垃圾值,解决方式:声明时直接初始化(如int merged[100] = {0};),或用memset()函数将数组初始化为0。合并循环遗漏剩余元素
仅处理两个数组同时有未遍历元素的情况,当其中一个数组遍历完后,未将另一个数组的剩余元素完整拷贝到合并数组中。需在主循环后添加两个while循环,分别追加两个数组的剩余元素。合并数组索引未正确更新
在比较赋值后忘记递增合并数组的索引变量(如k++),导致元素覆盖或未写入正确位置,未被写入的区域残留垃圾值。输出时遍历范围错误
输出合并数组时,遍历长度超出实际合并后的元素总数(即n1 + n2),导致输出了未写入的垃圾值区域。
错误代码示例与修正对比
错误代码片段:
#include <stdio.h> int main() { int arr1[5] = {1,3,5,7,9}; int arr2[3] = {2,4,6}; int merged[8]; // 未初始化 int i=0, j=0, k=0; while(i < 5 && j < 3) { if(arr1[i] < arr2[j]) { merged[k] = arr1[i]; i++; } else { merged[k] = arr2[j]; j++; } // 遗漏k++ } // 遗漏拷贝剩余元素 for(int m=0; m<8; m++) { printf("%d ", merged[m]); } return 0; }
修正后的代码:
#include <stdio.h> int main() { int arr1[5] = {1,3,5,7,9}; int arr2[3] = {2,4,6}; int merged[8] = {0}; // 初始化数组 int i=0, j=0, k=0; while(i < 5 && j < 3) { if(arr1[i] < arr2[j]) { merged[k] = arr1[i]; i++; } else { merged[k] = arr2[j]; j++; } k++; // 更新合并数组索引 } // 拷贝arr1剩余元素 while(i < 5) { merged[k] = arr1[i]; i++; k++; } // 拷贝arr2剩余元素 while(j < 3) { merged[k] = arr2[j]; j++; k++; } // 仅遍历实际合并的元素数量 for(int m=0; m<5+3; m++) { printf("%d ", merged[m]); } return 0; }
内容的提问来源于stack exchange,提问作者Aniket Tripathi
相关产品推荐
相关产品推荐

