C++ 函数中的动态2D数组分配,并将其返回到main?

C++ 函数中的动态2D数组分配,并将其返回到main?,c++,arrays,dynamic-memory-allocation,dynamic-arrays,C++,Arrays,Dynamic Memory Allocation,Dynamic Arrays,我写了一个代码,但我不知道它是如何工作的。该场景是在读取外部文件的函数中动态分配2D数组 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;

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

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 collumns

    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;
}
void load_数组(双**(&a),int*行,int*随机值)
{
//我知道列数,例如3
int i,j;
双温;
文件*fp;
//给随机变量赋值
*随机值=5;
//读取文件并确定代码块的行数
{
//代码在这里
}
a=(双**)calloc((*行),sizeof(双*);

对于(i=0;i您正在混合两种语言,因为您通过引用(
double**(&a)
)传递指针到指针参数,但您通过
calloc
使用C动态分配,而不是
new[]
delete[]

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

如果变量是指针(例如
int*行
),则必须取消引用(通过
*
运算符)以获取其值或为其分配新值


<> >用<代码>和<代码>(仅为C++)声明的变量是对现有变量(一种别名)的引用。将数组作为“代码”>双**(& a)< /代码>意味着您正在将引用传递给<代码>双*< />代码>,在引擎盖下只是指向指针的指针(A<代码>双***/COD>)。实际上,在您的示例中,这用于将现有的
double**
传递给函数,让函数初始化数组并将结果地址直接存储在传递的参数中。如果您没有任何特定的要求,则可以从函数返回
double**
,而不是使用refeC++和C++是不同的语言,在C中使用<代码> MalOC 动态分配内存,而C++中,最好使用<代码>新< /Calp>或智能指针2)请正确地缩进代码,这是不可读的。这是C++代码,如这个<代码>空载Load数组(双**(a),int *行,int *Read Valm Valb)
不会被C编译器编译。如果这是C,您将传递一个未初始化的指针到
load\u array()
,并且
load\u array()
无法修改
main()
中的变量-您的代码绝不会将数组返回到
main()
。同样在C中,参数声明
double**(&a)不会编译;它是无意义的。代码必须是“C++”;“代码> STD::向量< /代码>肯定。不要用C标记对C++进行双重标签问题;它会使人交叉。此外,在<代码>()中调用的<代码>加载子数组()/<代码>函数
不是代码中显示的参数;该函数使用两个参数调用,但显示的函数使用三个参数。另请参见。请正确缩进代码,因为它很难阅读。谢谢您的回答“实际上,在您的示例中,这用于将现有的double**传递给函数,让函数初始化数组并将结果地址直接存储在传递的参数中。“这就是我想要做的。我可以返回一个double**,但在更一般的情况下,函数可以更改为2个或更多数组。还有其他方法吗?直接在传递的参数中初始化函数中的数组?