我使用下面的代码片段使用最小数量为二维数组分配内存malloc()
calls.
我想使用下标 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;
}
无论输入什么,程序都会正确输出。
但是,它正在显示运行时错误 . Why?
如果数组维度在编译时已知(如您的示例中所示),那么您确实可以在一个数组中分配内存malloc
称呼。但是您必须使用正确的指针类型来访问该内存。在你的情况下,这将是你的p
指针。你p
指针已正确声明,但由于某种原因,您完全忽略了它的存在scanf
并使用ptr
反而。
停止尝试使用ptr
用于数组访问。使用p
。访问数组元素为p[i][j]
它应该有效。
事实上,我会摆脱ptr
完全并按以下方式进行内存分配
int (*p)[COL] = malloc(ROW * sizeof *p);
而且,由于both维度在编译时已知,您实际上可以将其分配为
int (*p)[ROW][COL] = malloc(sizeof *p);
但在这种情况下,您必须记住以以下方式访问数组(*p)[i][j]
(注意*
)。选择您喜欢的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)