如何将指针传递给函数并在函数C++中动态分配内存

Jam*_*mes 4 c++ pointers

我正在尝试声明一个指针并将该指针传递给分配内存的函数.这是一个最小的例子:

#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;
        }

}
Run Code Online (Sandbox Code Playgroud)

这段代码编译,但是当我尝试打印出X的值时,我遇到了分段错误.我知道我没有正确地将变量传递给函数,但我不知道该怎么做.我相信我正在使用x的副本.

此外,编写此代码是为了重现我在更大的代码中遇到的问题.

Vla*_*cow 14

参数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;
}
Run Code Online (Sandbox Code Playgroud)

至于我,我会按以下方式定义函数

double * alloc_mem( int &size ) 
{
   size = 10;

   x = new double [size];

   for ( int i = 0; i < size; i++ ) x[i] = i;

   return x;
}
Run Code Online (Sandbox Code Playgroud)

如果在调用函数之前已知大小,那么它可以写得更简单

double * alloc_mem( int size ) 
{
   x = new double [size];

   for ( int i = 0; i < size; i++ ) x[i] = i;

   return x;
}
Run Code Online (Sandbox Code Playgroud)

考虑到这个循环

   for ( int i = 0; i < size; i++ ) x[i] = i;
Run Code Online (Sandbox Code Playgroud)

可以代替标准算法std::iota例如

std::iota( x, x + size, 0.0 );
Run Code Online (Sandbox Code Playgroud)