调用返回指针的函数时出现分段错误 我在调用C++中返回指针的函数时得到了一个Sebug。这里有什么问题?函数似乎在做它应该做的事情,但是当它返回时,它就会遇到问题 #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); }

调用返回指针的函数时出现分段错误 我在调用C++中返回指针的函数时得到了一个Sebug。这里有什么问题?函数似乎在做它应该做的事情,但是当它返回时,它就会遇到问题 #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); },c++,function,pointers,C++,Function,Pointers,为z分配内存,但不将其传递给函数。此外,您试图在函数中填充的数组没有为其分配内存。因此,即使没有segfault,返回的指针也会指向某个随机地址。将其更改为以下内容(这是可能的修复方法之一): #包括 双*v\u标量产品(双a,双*b,整数n) { double*res=新的double[3]; int i; 对于(i=0;i双*RES/COD>只声明指针变量。事实上,你不想让它指向一个有效的双< /C> >,但是你甚至需要一个数组(如果它真的是C++,为什么不按C++的方式,如CRIS建议的那

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

#包括
双*v\u标量产品(双a,双*b,整数n)
{
double*res=新的double[3];
int i;
对于(i=0;istd::cout尝试初始化数组

double* res = new double[n];
或者任何你喜欢的变化

这样,当您在此处取消对点的引用时:

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

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

让我们使用
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);
}

现在您不需要
n
参数,因为
vector
通过调用
vector::size()

res
可以知道它的大小。您应该为它分配一些内存。您应该使用
std::vector
(或者类似于
std::valarray
,它只是
va*=4.
)你不分配内存。代码>双*RES/COD>只声明指针变量。事实上,你不想让它指向一个有效的<代码>双< /C> >,但是你甚至需要一个数组(如果它真的是C++,为什么不按C++的方式,如CRIS建议的那样?)<代码> *(RES+I)= A*B[i];< /Cord>这是什么意思?<代码>(res+i处的值)=a*(b[i]处的指针)
?我对我得到的反对票很好奇。我违反了这里的任何规则吗?我是新来的。这不是讨论此类问题的论坛吗?就是这样。谢谢!!这可能适用于琐碎的程序,但一旦你需要在更复杂的程序中这样做,或者编写一个在多个地方调用v_scalar_prod的更大程序,这将不是推荐的方法这是一个很好的方法。@PaulMcKenzie我现在知道了。我会再试试std::vector或std:valarray。@Physical-我发布了一个显示向量用法的答案。@Physical-你可以使用初始化语法使用
C++11
DoubleArray y={1,2,3};
甚至更好,使用
DoubleArray b
(auto&x:b){x*=a;/*output*/}返回b;或C++98等效程序(如果需要)。
*(res+i) = a*b[i];
#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);
}
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;
}