为具有最少malloc调用数的2D数组分配内存
我使用下面的代码段,使用最少的为具有最少malloc调用数的2D数组分配内存,c,malloc,runtime-error,C,Malloc,Runtime Error,我使用下面的代码段,使用最少的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 <
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;
}
#定义第3行
#定义列2
int main()
{
void**ptr=malloc(行*COL*sizeof(int));
int(*p)[COL]=ptr;
int i,j;
对于(i=0;i|
无论输入什么,程序都能正确输出
但是,它正在显现。为什么?如果数组维度在编译时已知(如您的示例中),那么您确实可以在一次
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]
(注意*
)的形式访问数组。选择你喜欢的方法。试试这个:
#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;
}
#定义第3行
#定义列2
int main()
{
int*ptr=(int*)malloc(ROW*COL*sizeof(int));
int*p[COL];
int i,j;
fot(i=0;i
否,您看到的是输入。程序没有输出任何东西。scanf
输入不应该读入p
,而不是ptr
?是的,明白了。我感到困倦。我的错。不要理会我以前关于混合指数的评论。我错了。指数很好,呃。。。您正试图通过一个完全未初始化的指针p
访问p[i]
。这只会崩溃(最多)。我在第一个循环中初始化指针数组“p”。您无法初始化任何内容,因为您还没有数组。您的p
被声明为int(*p)[COL]
。此声明创建指向数组的指针(而不是您错误地认为的“数组或指针”)。此指针未初始化,即它不指向任何地方。您正试图将[]
运算符应用于不指向任何地方的指针。正如我上面所说的,这将无望地崩溃。试试看。我会试试看,如果是错的,我会更正/删除这个答案。如果你想声明一个“指针数组”,你应该使用int*p[COL]
(注意:没有大括号)。使用大括号int(*p)[COL]
将p
声明为指向数组的指针,而不是指针数组。