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

合并两个有序数组时出现“使用未初始化内存”警告的问题排查

合并有序数组的错误排查与修复

问题分析

你的代码存在多处逻辑错误,直接导致了未初始化内存访问警告和输出异常:

  • 数组越界访问:第一个while循环条件i <= n && j <= m错误,数组下标范围是0到n-1/m-1,当i == n或j == m时,访问a[i]或b[j]会读取未初始化的内存,触发警告。
  • 剩余元素合并逻辑错误:处理剩余元素的两个while循环内部嵌套了错误的for循环,既没有递增i/j导致死循环,也没有正确填充c数组的后续位置。
  • 输出逻辑错误:最后输出时,循环内始终访问c[k]而非当前循环变量对应的元素,且循环条件未覆盖所有合并后的元素。

修复后的代码

#include <iostream>

int main() {
    int n, m;
    int a[100], b[100], c[201];
    std::cin >> n;
    for (int i = 0; i < n; i++) {
        std::cin >> a[i];
    } 
    std::cin >> m;
    for (int i = 0; i < m; i++) {
        std::cin >> b[i];
    } 
    int i = 0, j = 0, k = 0;
    // 修正循环边界,避免越界访问未初始化内存
    while (i < n && j < m) {
        if (a[i] > b[j]) {
            c[k] = a[i];
            i++;
        } else {
            c[k] = b[j];
            j++;
        }
        k++;
    }
    // 处理a数组剩余元素,逐个填充到c
    while (i < n) {
        c[k] = a[i];
        i++;
        k++;
    }
    // 处理b数组剩余元素,逐个填充到c
    while (j < m) {
        c[k] = b[j];
        j++;
        k++;
    }
    // 正确遍历输出所有合并后的元素
    for (int p = 0; p < k; p++) {
        std::cout << c[p];
        // 可选:添加空格分隔元素,提升可读性
        // std::cout << " ";
    }
    std::cout << std::endl;
    return 0;
}

关键修复点说明

  1. 修正循环边界:将第一个while的条件改为i < n && j < m,确保只访问数组中已初始化的有效元素。
  2. 重构剩余元素填充逻辑:去掉嵌套的错误for循环,改为逐个将剩余元素放入c数组,同时递增i/j和k,避免死循环并完成正确填充。
  3. 修正输出逻辑:输出时使用循环变量p访问c[p],确保遍历所有合并后的元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:05:31