使用最少数量的malloc调用为2D数组分配内存

我使用下面的代码片段,使用最少数量的malloc()调用为2D数组分配内存。

我想使用下标p [i] [j]访问数组。

 #define ROW 3 #define COL 2 int main() { void **ptr = malloc( ROW*COL* sizeof(int) ); int (*p)[COL] = ptr; int i, j; for( i = 0; i < ROW; ++i ) for( j = 0; j < COL; ++j ) scanf("%d", &ptr[i][j]); for( i = 0; i < ROW; ++i ) { for( j = 0; j < COL; ++j ) printf("%d ", p[i][j]); printf("\n"); } return 0; } 

无论输入是什么,程序都正确输出。

但是,它显示运行时错误 。 为什么?

如果数组维度在编译时是已知的(如在您的示例中),那么您确实可以在一个malloc调用中分配内存。 但是您必须使用正确的指针类型来访问该内存。 在你的情况下,这将是你的指针。 你的p指针是正确声明的,但你出于某种原因完全忽略了它在scanf存在并改为使用ptr

停止尝试使用ptr进行数组访问。 使用p 。 以p[i][j]访问数组元素,它应该可以工作。

事实上,我会完全摆脱ptr并以下列方式进行内存分配

 int (*p)[COL] = malloc(ROW * sizeof *p); 

此外,由于两个维度在编译时都是已知的,因此您实际上可以将其分配为

 int (*p)[ROW][COL] = malloc(sizeof *p); 

但在这种情况下,你必须记住以(*p)[i][j] (注意* )访问数组。 选择您喜欢的方法。

试试这个:

 #define ROW 3 #define COL 2 int main() { int *ptr = (int*)malloc( ROW*COL* sizeof(int) ); int *p[COL]; int i, j; fot (i = 0; i < COL; i++) p[i] = ptr + ROW * i; for( i = 0; i < ROW; ++i ) for( j = 0; j < COL; ++j ) scanf("%d", &p[i][j]); for( i = 0; i < ROW; ++i ) { for( j = 0; j < COL; ++j ) printf("%d ", p[i][j]); printf("\n"); } free(ptr); return 0; }