我正在使用下面的代码片段使用最少数量的 malloc()
调用为二维数组分配内存。
我想使用下标访问数组,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;
}
无论输入是什么,程序都能正确输出。
但是,它正在显示 Runtime error .为什么?
最佳答案
如果数组维度在编译时已知(如您的示例所示),那么您确实可以在一个 malloc
调用中分配内存。但是您必须使用正确的指针类型来访问该内存。在您的情况下,这将是您的 p
指针。您的 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]
访问数组(注意 *
)。选择您喜欢的方法。
关于c - 以最少的 malloc 调用次数为二维数组分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12133832/