C ++ 2D动态数组崩溃

时间:2009-11-30 10:34:35

标签: c++ dynamic multidimensional-array

嗨,我对2D动态阵列有一些问题。

int main()
{
   double **M;
   int M_dimension;
   int i;

   M_dimension = 10;

   M = new double *[M_dimension];
   for (i=0;i<M_dimension;i++)
   {
      M[i] = new double[M_dimension];
   }

   M[0][0] = 1.0;

...
}

程序有效,但我想使用这样的函数初始化2D数组:

void initialize2D(double **M,int M_dimension)
{
   int i;
   M = new double *[M_dimension];
   for (i=0;i<M_dimension;i++)
   {
      M[i] = new double[M_dimension];
   }
}

最后,程序看起来像这样:

int main()
{
   double **M;
   int M_dimension;
   int i;

   M_dimension = 10;

   initialize2D(M,M_dimension);        

   M[0][0] = 1.0; //crash

...
}

不幸的是,它在M[0][0] = 1.0;

崩溃了

感谢您提供任何帮助或建议。

4 个答案:

答案 0 :(得分:8)

您按值传递M,而不是按引用传递。 initialize2D需要更改指向指针M的值,使其指向已分配的内存

请尝试将功能签名更改为:

void initialize2D(double **&M,int M_dimension)

或者

void initialize2D(double ***M,int M_dimension) {
    ...
    *M = new double *[M_dimension];
    ...
}

答案 1 :(得分:1)

您需要传递对double**而不是double**的引用才能运行,否则在分配M后,对new的重新分配的修改会在退出函数时丢失

答案 2 :(得分:0)

问题可能在于您声明整数参数,例如int M_dimension void initialize2D(double ** M,int M_dimension)

然后将动态数组初始化为: M [i] =新双[M_dimension];

因为你将变量M_dimension声明为整数然后将其用作双精度

以这种方式尝试: 要么更改数组的数据类型,要么更改M_dimension,那么它们都具有相同的数据类型。

希望这会帮助你

答案 3 :(得分:0)

为什么不使用std::vectorBoost.MultiArray

将二维数组定义为generic vector of vectors in C++

非常容易