我正在尝试声明一个指针,并将该指针传递给分配内存的函数。这是一个最小的示例:
#include <string>
#include <iostream>
using namespace std;
void alloc_mem(int &size, double *x);
int main()
{
double *X;
int imax;
alloc_mem(imax, X);
cout << "imax = " << imax << endl;
for (int i = 0; i < imax; i++) {
cout << "X = " << X[i] << endl;
}
delete[]X;
return 0;
}
void alloc_mem(int &size, double *x)
{
size = 10;
x = new double[size];
for (int i = 0; i < size; i++) {
x[i] = (double)i;
}
}
这段代码可以编译,但是当我尝试打印X的值时遇到了段错误。我知道我没有正确地将变量传递给函数,但是我不确定该怎么做。我相信我正在使用x的副本。
另外,编写此代码是为了在更大的代码中重现我遇到的问题。
参数double *x
是函数alloc_mem的局部变量。当函数结束执行时,变量将被销毁。main中的原始变量X对此参数一无所知,因为它是通过值传递的,该值是在函数中使用的它的副本。
通过指针或通过引用传递指针。例如
void alloc_mem(int &size, double **x);
void alloc_mem(int &size, double * &x);
void alloc_mem(int &size, double **x)
{
size = 10;
*x = new double [size];
for ( int i = 0; i < size; i++ ) ( *x )[i] = i;
}
void alloc_mem(int &size, double * &x)
{
size = 10;
x = new double [size];
for ( int i = 0; i < size; i++ ) x[i] = i;
}
对于我来说,我可以通过以下方式定义函数
double * alloc_mem( int &size )
{
size = 10;
x = new double [size];
for ( int i = 0; i < size; i++ ) x[i] = i;
return x;
}
如果在调用函数之前知道大小,则可以编写得更简单
double * alloc_mem( int size )
{
x = new double [size];
for ( int i = 0; i < size; i++ ) x[i] = i;
return x;
}
考虑到循环
for ( int i = 0; i < size; i++ ) x[i] = i;
可以替代标准算法std::iota
,例如
std::iota( x, x + size, 0.0 );
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句