递归函数中的分段错误,将结果存储在向量中

时间:2017-09-10 04:13:39

标签: c++ function recursion vector segmentation-fault

我不断得到这个段错,但我不知道它来自哪里。 对不起,我还不熟悉编码。

#include <iostream>
#include <vector>

using namespace std;

vector<int> map(vector<int> v, vector<int>::iterator i, vector<int> result)  { //set i = v.begin() in main
    if (i==v.end()) {
        return result;
    }   else    {
        result.push_back((*i)*(*i));
        i++;
        map(v,i,result);
    }
}

int main()  {
    vector<int> v;
    vector<int> result;

    for (int i=0;i<20;i++)  {
        v.push_back(i);
    }

    vector<int>::iterator it=v.begin();

    result=map(v,it,result);
}

显然,我需要添加更多单词,因为我的问题主要是代码。

4 个答案:

答案 0 :(得分:2)

您按值传递向量,因此更改不会在函数调用中持续存在。

通过引用传递向量来实现此目的。

此外,您还需要在else案例中返回向量。

此外,也可以通过引用传递v,以便在yuo检查v.end()时迭代器可以正常。否则,它会在每个函数调用中查找v的不同副本。

把所有东西放在一起,你得到:

vector<int> map(vector<int>& v, vector<int>::iterator i, vector<int>& result)  { 
    if (i==v.end()) {
        return result;
    }   else    {
        result.push_back((*i)*(*i));
        i++;
        return map(v,i,result);
    }
}

答案 1 :(得分:1)

有两个问题:

由于您按值传递了第一个参数(std::vector),因此对map的每次调用都使用与原始不同的向量。因此,您传递的迭代器与传入的向量不兼容,并且您的程序将显示未定义的行为。

要解决此问题,请按引用传递std::vector,而不是按值传递。由于您也未更改函数中的vector,因此请转到const引用:

vector<int> map(const vector<int>& v, vector<int>::iterator i, vector<int> result)

现在迭代器正在迭代传入的实际向量,而不是向量的临时副本。

第二个问题是您没有从map函数返回值。不返回应该返回值的函数的值是未定义的行为。

要解决此问题,请删除else语句(以避免任何编译器警告)并从函数中返回值:

vector<int> map(const vector<int>& v, vector<int>::iterator i, vector<int> result) 
{   
   if (i == v.end()) 
      return result;
   result.push_back((*i)*(*i));
   i++;
   return map(v, i, result);
}

答案 2 :(得分:0)

问题几乎可以肯定是因为您在许多情况下都没有从递归函数返回值:

vector<int> map(vector<int> v, vector<int>::iterator i, vector<int> result)  { //set i = v.begin() in main
    if (i==v.end()) {
        return result;
    }   else    {
        result.push_back((*i)*(*i));
        i++;
        map(v,i,result);
       /** NO RETURN VALUE HERE **/
    }
}

相反,最后一行是:

return map(v,i,result);

理想情况下,您不会按值传递向量,但这不会导致程序崩溃,只是运行得更慢。

答案 3 :(得分:0)

崩溃的一个潜在原因是因为递归调用后面没有(或部分)返回语句。当调用者访问返回值时,结果是未定义的行为。

即使忽略这一点,参数也是按值传递的。因此,对向量所做的任何更改都不会对调用者可见。更重要的是,测试i == v.end()也将具有未定义的行为(另一个可能的崩溃原因),因为iv.end()不是从同一容器获取的迭代器(i是来自main()中向量的迭代器,v是该向量的副本 - 它有一组完全不同的迭代器。)

最后,std::map是标准库中的模板化类型。拥有一个名为map()的函数 - 特别是当using namespace std正在运行时,可能会使编程人员感到困惑,如果不会导致编译器模糊不清。