传递给函数的向量未被修改

时间:2017-07-23 06:18:48

标签: c++ function vector

所以我正在创建一个函数来获取向量的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;
}

3 个答案:

答案 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)

传递