调用返回指针的函数时出现分段错误

时间:2014-07-25 20:26:44

标签: c++ function pointers

我在调用一个在C ++中返回指针的函数时遇到段错误。这里的问题是什么?该函数似乎正在做它应该做的事情,但是当它返回时它会遇到问题。

#include<iostream>
double * v_scalar_prod(double a, double *b, int n)
{
    double *res ;
    int i;
    for (i = 0; i < n; i++) {
        *(res+i) = a*b[i];
        std::cout << std::setprecision(10) << "res = " << *(res+i) << '\n';
    }
    return res;
}


int main()
{


    double y[3] = {3., 5.45, 2.};
    double *z = new double[3];

    z = v_scalar_prod(4., y, 3);

}

输出:

$ ./program
res = 12
res = 21.8
res = 8
Segmentation fault (core dumped)

3 个答案:

答案 0 :(得分:1)

您为z分配内存,但您没有将其传递给函数。此外,您尝试在函数中填充的数组没有为其分配内存。因此,即使没有段错误,您返回的指针也会指向某个随机地址。将其更改为以下(这是可能的修复之一):

#include<iostream>
double * v_scalar_prod(double a, double *b, int n)
{
    double *res  = new double[3];
    int i;
    for (i = 0; i < n; i++) {
        *(res+i) = a*b[i];
        std::cout  << "res = " << *(res+i) << '\n';
    }
    return res;
}

int main()
{
    double y[3] = {3., 5.45, 2.};
    double *z ;

    z = v_scalar_prod(4., y, 3);
    delete [] z;
}

答案 1 :(得分:0)

尝试初始化数组

double* res = new double[n];

或者您喜欢的任何变体。

当你在这里取消引用这一点时就是这样:

*(res+i) = a*b[i];

您可以使用assign运算符将该空间的值分配给您计算的值。

答案 2 :(得分:0)

让我们使用std::vector

#include <iostream>
#include <vector>
#include <iomanip>
typedef std::vector<double> DoubleArray;

DoubleArray v_scalar_prod(double a, double *b, int n)
{
   DoubleArray res(n);
   for (int i = 0; i < n; i++) 
   {
        res[i] = a*b[i];
        std::cout << std::setprecision(10) << "res = " << res[i] << '\n';
   }
   return res;
}

int main()
{
   double y[3] = {3., 5.45, 2.};
   DoubleArray z = v_scalar_prod(4., y, 3);
}

没有内存泄漏,如果调用delete []也没有跟踪等。此外,此版本可以在更大,更复杂的程序中使用,而不必担心内存泄漏。

唯一需要仔细审查的是b函数中的v_scalar_prod在循环之前和循环期间是否指向有效内存。您还可以使b成为DoubleArray并通过const引用传递它。然后,您可以执行以下操作:

DoubleArray v_scalar_prod(double a, const DoubleArray& b)
{
   DoubleArray res(b.size());
   for (int i = 0; i < b.size(); i++) 
   {
        res[i] = a*b[i];
        std::cout << std::setprecision(10) << "res = " << res[i] << '\n';
   }
   return res;
}

现在您不需要n参数,因为vector通过调用vector::size()知道其大小。