错误在c中使用realloc重新分配2d数组

时间:2014-11-04 10:50:36

标签: c arrays realloc

我在尝试重新分配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);

    }
 }

 }

2 个答案:

答案 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);

    }
 }

 }