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

合并两个有序数组程序输出异常,请求代码问题排查与修改指导

合并有序数组出现垃圾值的常见修正点

以下是这类问题最常出现的几个错误位置及修正方案:

  • 未初始化合并数组
    局部数组默认会保留内存中的随机垃圾值,解决方式:声明时直接初始化(如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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:01:25