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

