调用返回指针的函数时出现分段错误
Segmentation fault when calling a function returning a pointer
在调用返回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)
您为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;
}
让我们使用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[]被调用,没有跟踪,等等。此外,这个版本可以在更大、更复杂的程序中使用,而不必担心内存泄漏。
唯一需要仔细检查的是v_scalar_prod
函数中的b
在循环之前和循环期间是否指向有效内存。你也可以让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()
知道它的大小。
尝试初始化数组
double* res = new double[n];
或者任何你喜欢的变化
这样当你对这里的点进行引用时:
*(res+i) = a*b[i];
可以使用赋值操作符将该空格处的值赋给所计算的值。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?