You need to enable JavaScript to run this app. C++合并两个有序数组到vector仅输出1、2元素的问题排查
优惠活动
大模型
产品
解决方案
定价
更多

C++合并两个有序数组到vector仅输出1、2元素的问题排查

问题根因

你的归并算法逻辑本身是正确的,输出异常的核心原因是函数内通过sizeof计算数组长度的方式完全失效:

  • C++语法规则中,数组作为函数形参标注为int arr1[]时,会自动退化为指向数组首元素的指针(等价于int* arr1),此时在函数作用域内执行sizeof(arr1)拿到的是指针本身的内存大小(64位环境下为8字节),而非原数组的总字节长度。
  • 按这个错误取值计算,你得到的arr1size = sizeof(arr1)/sizeof(arr1[0])实际结果为8/4=2,同理arr2size也等于2,归并流程仅会处理两个数组的前2个元素,最终输出自然只有1、2两个值。
修复方案

最通用的修复方式是将数组长度作为独立参数显式传入merge函数,避免依赖函数内的sizeof计算长度,修改后的核心代码如下:

  • 重写merge函数签名,增加两个长度参数,将原有循环判断边界替换为传入的实际长度
vector<int> merge(int arr1[], int size1, int arr2[], int size2)
{
    vector<int> arr3;
    int i = 0, j = 0;
    while(i < size1 && j < size2)
    {
        // 原有归并逻辑完全保留,无需修改
        if(arr1[i] <= arr2[j])
        {
            arr3.push_back(arr1[i]);
            i++;
        }
        else
        {
            arr3.push_back(arr2[j]);
            j++;
        }
    }
    while(i < size1)
    {
        arr3.push_back(arr1[i]);
        i++;
    }
    while(j < size2)
    {
        arr3.push_back(arr2[j]);
        j++;
    }
    return arr3;
}
  • 在main函数中计算数组真实长度(main作用域内的数组不会发生指针退化,可正常通过sizeof计算长度),调用merge时传入对应参数:
int main()
{
    int arr1[] = {1, 3, 5, 7};
    int arr2[] = {2, 4, 6, 8};
    int size1 = sizeof(arr1) / sizeof(arr1[0]);
    int size2 = sizeof(arr2) / sizeof(arr2[0]);
    vector<int> arr3 = merge(arr1, size1, arr2, size2);
    for(int i = 0; i < arr3.size(); i++)
    {
        cout << arr3[i] << endl;
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 10:24:01