所以我正在创建一个函数来获取向量的certatin元素并将它们存储到另一个向量中。每当我运行程序时,它都会出现分段错误错误?为什么会发生这种情况,如何解决这个问题,以免发生这种情况?
#include <iostream>
#include <vector>
#include <string>
using namespace std;
void addition (vector <char> a, vector <string> b)
{
for (int i = 0; i < a.size(); ++i)
{
if (a[i] == '3')
{
b.push_back("3");
}
if (a[i] == '4')
{
b.push_back("4");
}
if (a[i] == '+')
{
b.push_back("+");
}
}
}
int main()
{
vector <char> v1 = {'3', '4', '+', '3', '4'};
vector <string> v2;
addition(v1, v2);
cout << v2[0] << endl;
return 0;
}
答案 0 :(得分:5)
参数b
被声明为值传递,因此它只是参数的副本,addition()
内的任何修改都与原始参数无关传入的参数(即v2
中的main()
)。然后cout << v2[0] << endl;
会导致undefined behavior(意味着一切皆有可能),因为v2
仍然是空的。
您应该将其更改为传递参考,例如
void addition (vector <char> a, vector <string>& b)
// ~
顺便说一句:a
也应该被宣布为传递参考,以避免不必要的复制,.e.g
void addition (const vector <char>& a, vector <string>& b)
答案 1 :(得分:4)
您传递了矢量的副本而不是参考 变化:
void addition (vector <char> a, vector <string> b)
成:
void addition (const vector <char> &a, vector <string> &b)
注意:我将a
更改为引用也只是为了保存不必要的副本,并将其设为const以确保它不会被更改。
答案 2 :(得分:1)
您已传递了矢量v2
的新副本。因此,函数中对v2
所做的更改实际上是对其副本进行的,而不是v2
结果v2
实际上仍为空,访问v2[0]
会导致细分错误。
解决方案是将v2
的引用作为
void addition (vector <char> a, vector <string> &b)