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

C++合并有序数组后无法输出正确结果,始终打印原数组求助

问题排查与修复方案

核心问题分析

  • nums1空间不足:你的merge函数逻辑是从后往前合并到nums1的末尾,但main函数里的vector<int> i(即nums1)初始大小只有4,合并后需要容纳10个元素,直接访问k = n+m-1的位置属于越界内存访问,这是C++中的未定义行为,所以会出现输出原数组或垃圾值的情况。
  • 变量命名冲突:main里的vector变量名用了i和j,和merge函数里的循环变量重名,虽语法允许,但可读性极差,容易混淆。

修复后的代码

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void merge(vector<int>& nums1, int n, vector<int>& nums2, int m) {
    int i = n - 1, j = m - 1, k = n + m - 1;

    while (i >= 0 && j >= 0) {
        if (nums1[i] < nums2[j]) {
            nums1[k--] = nums2[j--];
        } else {
            nums1[k--] = nums1[i--];
        }
    }
    // 补全nums2剩余的元素
    while (j >= 0) {
        nums1[k--] = nums2[j--];
    }
}

int main() {
    // 重命名变量,避免与函数内循环变量冲突
    vector<int> nums1 = {1, 3, 5, 7};
    vector<int> nums2 = {0, 2, 4, 6, 8, 10};
    int n = nums1.size();
    int m = nums2.size();

    // 关键操作:给nums1扩容到合并后的总长度,预留足够空间
    nums1.resize(n + m);
    merge(nums1, n, nums2, m);

    // 打印合并结果
    for (int num : nums1) {
        cout << num << " ";
    }
    cout << endl;
    
    return 0;
}

修复要点说明

  1. 扩容nums1:调用merge前用nums1.resize(n + m)将nums1的大小扩展到合并后的总长度,确保有足够空间存储所有元素,彻底避免越界访问。
  2. 变量重命名:将main里的vector变量改为nums1和nums2,与函数参数名对应,提升代码可读性,消除命名混淆。
  3. 分离职责:让merge函数仅负责合并逻辑,打印操作放在main函数中,符合单一职责原则,代码结构更清晰。

内容的提问来源于stack exchange,提问作者All-Rounder CREW

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 15:10:25