在函数中动态分配二维数组并将其返回给主函数?

问题描述 投票:0回答:1

我写了一段代码,但不知道它是如何工作的。该场景是在读取外部文件的函数中动态分配二维数组

void load_array(double **(&a), int *rows, int *random_val)
{
   //I know the number of columns e.g. 3
   int i,j;
   double temp;
   FILE *fp;


   //Assign a value to random variable
   *random_val=5;


   //Read file and determine number of lines(rows) block of code
   {
      //Code goes here
   }

    a=(double **)calloc((*rows),sizeof(double *);
    for(i=0;i<(*rows);i++)
    a[i]=(double **)calloc(2,sizeof(double *); //Only 2 columns

    i=0;

    fp=fopen("input","r");
    fscanf(fp,"%lf\t%lf\n",&a[0][0],&a[0][1])
    while(!feof(fp))
    {
       i=i+1;
       fscanf(fp,"%lf\t%lf\n",&a[i][0],&a[i][1]);
    }
    *rows=i;
    fclose(fp);

}

int main(void)
{
    double **A;
    int row_count;
    double temp;
    load_array(A,&row_count, &temp);
    return 0;
}

我无法理解以下几点:

  • 我必须使用带有星号的函数中的值吗? 例如
    for(i=0;i<rows;i++)
    而不是
    for(i=0;i<(*rows);i++)
    random_val=5;
    而不是
    *random_val=5;
  • 为什么我以这种方式声明函数,对数组使用
    **(&a)
    ? 而且我不明白为什么要这样传递数组 (没有
    &
    )。

我的指针知识有些有限,我很困惑。请不要提议

std::vector
。我想先澄清这一点。

c++ arrays dynamic-memory-allocation dynamic-arrays
1个回答
2
投票

您正在混合两种语言,因为您通过引用传递指针到指针参数 (

double **(&a)
),但您通过
calloc
使用 C 动态分配,而不是
new[]
delete[]

这只是意味着您应该在尝试编写随机代码之前阅读一些文档或指南。

如果变量是指针(例如

int* rows
),那么您必须取消引用它(通过
*
运算符)才能获取其值或为其分配新值。

&
声明的变量(仅限 C++)是对现有变量的引用(一种别名)。像
double **(&a)
中那样传递数组意味着您将引用传递给
double**
,它在幕后只是一个指向指针到指针的指针(
double***
)。实际上,在您的示例中,这用于将现有的
double**
传递给函数,让函数初始化数组并将结果地址直接存储在传递的参数中。如果您没有任何具体要求,那么您可以从函数返回
double**
,而不是使用引用。

© www.soinside.com 2019 - 2024. All rights reserved.