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

C++调用接收两个vector的函数后后续代码不执行且无编译报错

C++调用自定义函数后后续代码无法执行的问题排查与修复

核心原因

  • 输入逻辑错误:读取nums2元素的循环条件写反,使用了i<m而非i<n,导致nums2的实际元素数量和参数n不匹配,后续访问nums2[j]时极易出现数组越界,触发未定义行为。
  • 函数内死循环:fun函数第一个while循环的逻辑存在严重问题,循环条件为i<m or j<n,但循环内所有分支都只对i做递增,j全程没有变化。当i增长到等于m后,只要j还小于n,循环条件就会永久成立,程序卡死在这个循环中,自然不会执行后续的cout语句。
  • 数组越界访问:当i >= m时仍然访问nums1[i],当j >= nums2实际长度时访问nums2[j],都属于越界访问,会触发不可预期的未定义行为,也可能导致程序崩溃或卡死。
  • 额外功能问题:函数参数nums1、nums2都是值传递,函数内对两个vector的修改不会同步到外部的实参,即使逻辑修复,也无法拿到合并后的结果。

修复方案

第一步:修复输入逻辑

将读取nums2的循环条件修改为正确的i<n:

// 原错误代码
// for(int i=0; i<m; i++){
// 修正后
for(int i=0; i<n; i++){
    int k;
    cin>>k;
    nums2.push_back(k);
}

第二步:修正fun函数逻辑

如果你的需求是合并两个有序数组到nums1中,首先将参数改为引用传递,再修正双指针的逻辑:

// 参数加&改为引用传递,才能修改外部实参
void fun(vector<int>& nums1, int m, vector<int>& nums2, int n){
    int i = 0, j = 0;
    vector<int> res;
    // 双指针遍历两个数组
    while(i < m && j < n){
        if(nums1[i] <= nums2[j]){
            res.push_back(nums1[i]);
            i++;
        }else{
            res.push_back(nums2[j]);
            j++;
        }
    }
    // 加入剩余元素
    while(i < m) res.push_back(nums1[i++]);
    while(j < n) res.push_back(nums2[j++]);
    // 覆盖原nums1
    nums1 = move(res);
}

如果不需要保留合并结果,只是要修复卡死问题,只要在原函数的第一个while循环里补充j的递增逻辑、调整循环边界避免越界即可。

第三步:验证执行

修复后调用fun函数,后续的cout<<"last"<<endl;就能正常输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 07:36:03