2017-07-23 59 views
0

所以我正在做一個函數來獲取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; 
} 
+0

爲什麼?我很困惑 – bastwendo

+0

我沒仔細看,我的錯誤。回收 – CIsForCookies

+0

如果避免使用out參數,程序的流程將變得更加清晰。例如。 '''矢量另外(矢量一個)'''。還有很多其他很好的理由來避免它們。 – tillaert

回答

4

您傳遞的是向量的副本而不是參考。
變化:

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

到:

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

注:我改變a一個參考太只是爲了節省不必要的副本,並使其常量,以確保它不會改變。

5

b被聲明爲傳遞的價值,所以它只是一個參數的副本,裏面addition()上的任何修改無關與傳入(即main()v2)原始的參數的參數。然後cout << v2[0] << endl;將導致undefined behavior(意味着任何事情都有可能),因爲v2仍然是空的。

您應該將其更改爲傳遞引用,例如,

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

BTW:a應被聲明爲傳遞通過引用過,以避免不必要的複製,.e.g

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

您已通過矢量v2的新副本。因此,在函數中對v2所做的更改實際上是對其副本進行的,而不是v2
因此v2實際上保持空白,並且訪問v2[0]給出了分段錯誤。

解決方案是通過的v2引用作爲

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