使用最少数量的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; }