我在尝试重新分配2d int数组时遇到的巨大应用程序中出现错误。为了缩小问题范围,我只使用重新分配生成了一个小代码。 错误:
a.out: malloc.c:3574: mremap_chunk: Assertion ((size + offset) & (mp_.pagesize-1)) == 0' failed.
中止。
相关代码:
int main()
{
int **am=NULL,size=0,ans=0,i;
char **name=NULL;
while(ans!=7)
{
printf("\n\n\t1. Add a Point \n\n\t2.Exit\n\n\t\t Enter your Choice : ");
scanf("%d",&ans);
switch(ans)
{
case 1 :
name=realloc(name,(size+1)*sizeof(char *));
name[size]=realloc(name[size],100*sizeof(char));
printf("\nEnter Name of Point : ");
scanf("%s",name[size]);
am=realloc(am,(size+1)*sizeof(int *));
am[size]=realloc(am[size],(size+1)*sizeof(int)); ``
if(size > 0 && am==NULL)
{
printf("Error : Can not Allocate Memory !");
break;
}
for(i=0;i<=size;i++)
{
if(i!=size)
{
am[size][i]=INFINITE;
am[i][size]=INFINITE;
}
else
am[i][size]=0;
}
size++;
break;
case 2 :
exit(0);
}
}
}
答案 0 :(得分:1)
你的第一个问题是:
name=realloc(name,(size+1)*sizeof(char *));
name[size]=realloc(name[size],100*sizeof(char));
realloc (NULL,)
返回的内存未初始化。这意味着您将随机指针传递给第二个realloc()
。请改用malloc()
。
第二对realloc()
电话也是如此。
这里还有另一个问题:
for(i=0;i<=size;i++)
{
if(i!=size)
{
am[size][i]=INFINITE;
am[i][size]=INFINITE;
您每am[i][size]
次访问am[i]
,但只有最后一个实际拥有那么多元素。分配的金额将在while
循环的每一轮中增长。你需要重新思考你的逻辑。
答案 1 :(得分:0)
这是真正需要的;在重新分配am [size]之上添加for循环以使方形数组为[size] [size]
代码:
int main()
{
int **am=NULL,size=0,ans=0,i;
char **name=NULL;
while(ans!=7)
{
printf("\n\n\t1. Add a Point \n\n\t2.Exit\n\n\t\t Enter your Choice : ");
scanf("%d",&ans);
switch(ans)
{
case 1 :
name=realloc(name,(size+1)*sizeof(char *));
name[size]=realloc(name[size],100*sizeof(char));
printf("\nEnter Name of Point : ");
scanf("%s",name[size]);
am=realloc(am,(size+1)*sizeof(int *));
for(i=0;i<=size;i++)
am[i]=realloc(am[i],(size+1)*sizeof(int)); ``
if(size > 0 && am==NULL)
{
printf("Error : Can not Allocate Memory !");
break;
}
for(i=0;i<=size;i++)
{
if(i!=size)
{
am[size][i]=INFINITE;
am[i][size]=INFINITE;
}
else
am[i][size]=0;
}
size++;
break;
case 2 :
exit(0);
}
}
}