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; }
修复要点说明
- 扩容nums1:调用
merge前用nums1.resize(n + m)将nums1的大小扩展到合并后的总长度,确保有足够空间存储所有元素,彻底避免越界访问。 - 变量重命名:将main里的vector变量改为
nums1和nums2,与函数参数名对应,提升代码可读性,消除命名混淆。 - 分离职责:让
merge函数仅负责合并逻辑,打印操作放在main函数中,符合单一职责原则,代码结构更清晰。
内容的提问来源于stack exchange,提问作者All-Rounder CREW
相关产品推荐
相关产品推荐

