我在调用一个在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)
答案 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()
知道其大小。