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
相关产品推荐
相关产品推荐

