嗨,我对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;
感谢您提供任何帮助或建议。
答案 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::vector
或Boost.MultiArray
将二维数组定义为generic vector of vectors in C++
非常容易