链接列表插入导致sysmalloc断言错误

时间:2012-01-30 08:44:04

标签: c

我编写了一个代码来将新成员添加到列表中。当我加入两个成员时它的工作正常。但是,只要我添加第三个并编译并运行代码就会给我一个错误。代码和错误如下:

#include<stdio.h>
#include<stdlib.h>

struct list_no {
struct list_no *prev,*nest;
struct linked_list *fnl;
int seq_no;
};
static int counter = 0;

struct list_no *lists,*first;

int add_list()
{
   struct list_no *temp;

    counter++;
    if(lists == '\0')
    {
         lists = (struct list_no *)malloc(sizeof(struct list_no));
         lists->prev = '\0';
         lists->nest = '\0';
         lists->fnl  = '\0';
         lists->seq_no = 1;
         first = lists;
    }
    else
    {
         temp = lists;
         lists->nest = (struct list_no *)malloc(sizeof(struct linked_list));
         lists = lists->nest;
         lists->fnl = '\0';
         lists->prev = temp;
         lists->nest = NULL;
         lists->seq_no = counter;
    }
    return 0;
}

int main()
{
   int i=0,lcount;
   int i=0,lcount;

   char ch = 'y';
   first = '\0';
   lists = first;
   int w;

   while(i != 3)
   {
       add_list();
       printf("\n the val ::%d\n",lists->seq_no);
       i++;
   }

   return 0;
}

./a.out之后的错误消息是:

the val ::1
the val ::2

a.out: malloc.c:3097: sYSMALLOc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted

为什么它无法添加第三个成员?

4 个答案:

答案 0 :(得分:1)

您的第二个malloc使用sizeof(struct linked_list),应为sizeof(struct linked_no) 我想这个结构小于list_no,所以当写你腐败的记忆时 在第三次分配时,malloc看到了腐败并且感到不安。

其他一些观点:

  1. &#34;下一个&#34;应拼写为&#34; x&#34;,而不是&#34; nest&#34;。
  2. 指针应使用NULL初始化,而不是'\0'(最终相同,但NULL是正确的类型)。
  3. 您应该尝试删除重复的条目分配和初始化(第一次和下一次)。你的主要错误部分是由于这种重复造成的。

答案 1 :(得分:0)

两个问题突出:

1)以下内容:

lists->nest = (struct list_no *)malloc(sizeof(struct linked_list));

应该使用sizeof(struct list_no)而不是sizeof(struct linked_list)。这可能是导致眼前问题的原因。

2)假设您的列表包含两个元素。现在考虑以下一行:

  lists->nest = (struct list_no *)malloc(sizeof(struct linked_list));

在上述执行之前,lists->nest的价值是不可避免的。你已经泄露了记忆并丢失了部分名单。

答案 2 :(得分:0)

您覆盖指针

  temp = lists;
  lists->nest = (struct list_no *)malloc(sizeof(struct linked_list));
  lists = lists->nest;

因此temp指向与lists相同的内存。然后为lists->neste分配内存。之后,你让lists指向那个记忆,也就是temp指向它。

尝试

memcpy((void*)temp, (*void) lists, sizeof(lists));

答案 3 :(得分:0)

因为在第二种情况下你会这样做:

(struct list_no *)malloc(sizeof(struct linked_list));

可能分配的内存不足,因为它只为linked_list结构分配了足够的内存而不是list_no。你想做的事:

(struct list_no *)malloc(sizeof(struct list_no));

另外:投放malloc的返回结果是不必要的,只是添加了混乱,而不是'\0',您应该使用NULL,因为它使代码更容易阅读。