加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:44:11 所属栏目:百科 来源:网络整理
导读:我正在尝试声明一个指针并将该指针传递给分配内存的函数.这是一个最小的例子: #include string#include iostreamusing namespace std;void alloc_mem(int size,double *x);int main(){ double *X; int imax; alloc_mem(imax,X); cout "imax = " imax endl;
我正在尝试声明一个指针并将该指针传递给分配内存的函数.这是一个最小的例子:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读