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

C++合并两个数组存入vector时输出含垃圾值该如何消除?

问题根源
  • 核心错误是原生数组作为函数参数时的指针退化问题:C++中如果把原生数组直接传入函数,参数会自动退化为对应类型的指针,原数组的长度信息会丢失。你代码中*(&a+1)-a这种计算数组长度的写法,仅在数组定义的当前作用域(即示例的main函数中)有效,在merge函数中使用该方法计算出的长度是完全错误的,导致循环访问了数组边界外的内存,产生垃圾值。
  • 次要错误是循环边界判断错误:while和if中的判断条件都错误使用了<=,就算长度计算正确,也会多访问一次超出数组下标的元素。
修复方案

方案1:新增数组长度参数

在merge函数中增加两个入参,分别传入两个数组的实际长度,长度计算在main函数的数组作用域内完成:

#include <bits/stdc++.h>
#include <vector>
#include <string>

using namespace std;

// 新增两个长度参数
vector <int> merge(int a[], int len_a, int b[], int len_b){
  vector <int> marr1;
  int i=0,j=0;
  // 边界用< 不用<=
  while(i+j < len_a + len_b)
  {
    if (i < len_a){
      marr1.push_back(a[i]);
      i++;
    }
    else{
       marr1.push_back(b[j]);
      j++;
    }
  }
  sort(marr1.begin(), marr1.end());
  return marr1;
}

int main(){
  int arr1[] = {5,7,4,5},arr2[] = {8,3,7,1,9};
  // 在数组定义的作用域内计算长度
  int len1 = *(&arr1 + 1) - arr1;
  int len2 = *(&arr2 + 1) - arr2;
  vector <int> ans = merge(arr1, len1, arr2, len2);
  for (auto num : ans){
    cout<<num<<"\t";
  }
  return 0;
}

运行输出:

1	3	4	5	5	7	7	8	9	

方案2:使用STL容器代替原生数组

直接用std::vector或std::array传递参数,容器自带size()方法可以获取准确长度,不会出现指针退化问题,写法更安全:

#include <bits/stdc++.h>
#include <vector>

using namespace std;

vector<int> merge(const vector<int>& a, const vector<int>& b){
  vector<int> marr1;
  marr1.reserve(a.size() + b.size()); // 预分配空间提升效率
  marr1.insert(marr1.end(), a.begin(), a.end());
  marr1.insert(marr1.end(), b.begin(), b.end());
  sort(marr1.begin(), marr1.end());
  return marr1;
}

int main(){
  vector<int> arr1 = {5,7,4,5}, arr2 = {8,3,7,1,9};
  vector<int> ans = merge(arr1, arr2);
  for (auto num : ans){
    cout<<num<<"\t";
  }
  return 0;
}

内容的提问来源于stack exchange,提问作者Tarun vignesh Selvabalaji

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 20:54:03