将三重指针传递给函数然后mallocing一个二维数组

得到分段错误并且不明白为什么,必须传递三重指针才能进行分配,所以无法改变…

这是function

void alloc2d(double*** a, int m, int n) { int i, j; **a = malloc(sizeof(double *) * m); a[0] = malloc(sizeof(double) * n * m); for(i = 0; i < m; i++) a[i] = (*a + n * i); } 

这是函数的调用……

 double** m; alloc2d(&m, 5, 10); double count = 0.0; for (int i = 0; i < 5; i++) for (int j = 0; j < 10; j++) m[i][j] = ++count; for (int i = 0; i < 5; i++) for (int j = 0; j < 10; j++) printf("%f ", m[i][j]); 

您希望为引用的指针分配内存。 改变**a = malloc(sizeof(double *) * m); to *a = malloc(sizeof(double *) * m); 。 你为a[0]分配了内存,所以用索引1开始你的循环。 与*a类似a[0]的类型是double** ,但是您想要将指针设置a[0]所指的位置。 a[0]更改为(*a)[0]并将a[i]更改为(*a)[i] 。 像这样调整你的代码:

 void alloc2d(double*** a, int m, int n) { *a = malloc( sizeof( double* ) * m ); // allocate the memory for (m) double* (*a)[0] = malloc( sizeof(double) * n * m ); // allocate the linearized memory for (n*m) double for( int i=1; i 

我认为这将更容易理解:

 void alloc2d(double*** a, int m, int n) { double **temp = malloc( sizeof( double* ) * m ); // allocate the memory for (m) double* temp[0] = malloc( sizeof(double) * n * m ); // allocate the linearized memory for (n*m) double for ( int i=1; i