传递给函数的向量没有被修改

Posted

技术标签:

【中文标题】传递给函数的向量没有被修改【英文标题】:Vectors passed to function aren't being modified 【发布时间】:2017-07-23 06:18:47 【问题描述】:

所以我正在制作一个函数来获取向量的某些元素并将它们存储到另一个向量中。每当我运行程序时,它都会出现分段错误错误?为什么会发生这种情况,我该如何解决,以免发生这种情况?

#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;

【问题讨论】:

为什么?我很困惑 我看的不够仔细,我的错。拿回来了 如果避免使用out-parameters,程序的流程会变得更加清晰。例如。 vector&lt;string&gt; addition(vector&lt;char&gt; a)。避免使用它们还有许多其他充分的理由。 @bastwendo 您是否对为什么在调用fooint foo(int x) x = 10; int main() int z = 1; foo(z); 不使z 等于10 感到困惑?出于同样的原因,您的向量不会改变 - 它被称为 按值传递 【参考方案1】:

参数b被声明为按值传递,所以它只是参数的一个副本,在addition()内部对其进行的任何修改都与传入的原始参数无关(即@987654324 @ 在main())。那么cout &lt;&lt; v2[0] &lt;&lt; endl; 将导致undefined behavior(意味着一切皆有可能),因为v2 仍然是空的。

您应该将其更改为传递引用,例如

void addition (vector <char> a, vector <string>& b)
//                                             ~

顺便说一句:a 也应该声明为传递引用,以避免不必要的复制,例如

void addition (const vector <char>& a, vector <string>& b)

【讨论】:

四年后,我想我明白我的错误了。我不明白按值传递和按引用传递之间的区别。谢谢大家【参考方案2】:

您传递的是向量的副本,而不是参考。 变化:

void addition (vector <char> a, vector <string> b)

进入:

void addition (const vector <char> &a, vector <string> &b)

注意:我也将 a 更改为引用,只是为了保存不必要的副本,并将其设置为 const 以确保它没有被更改。

【讨论】:

【参考方案3】:

您已经传递了向量v2 的新副本。所以函数中对v2所做的更改实际上是对其副本进行的,而不是v2。 结果 v2 实际上保持为空,访问 v2[0] 会导致分段错误。 解决方案是将v2 的引用传递为void addition (vector &lt;char&gt; a, vector &lt;string&gt; &amp;b)

【讨论】:

以上是关于传递给函数的向量没有被修改的主要内容,如果未能解决你的问题,请参考以下文章

将字符串向量传递给函数和函数原型问题c ++

将指针向量传递给c ++中的函数[重复]

C++11 线程:将向量传递给线程函数时出错

传递给函数时找不到c ++向量?

将结构指针向量对的值传递给函数

如何将字符串向量传递给execv