我编写了一个代码来将新成员添加到列表中。当我加入两个成员时它的工作正常。但是,只要我添加第三个并编译并运行代码就会给我一个错误。代码和错误如下:
#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
为什么它无法添加第三个成员?
答案 0 :(得分:1)
您的第二个malloc
使用sizeof(struct linked_list)
,应为sizeof(struct linked_no)
我想这个结构小于list_no
,所以当写你腐败的记忆时
在第三次分配时,malloc
看到了腐败并且感到不安。
其他一些观点:
NULL
初始化,而不是'\0'
(最终相同,但NULL
是正确的类型)。答案 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
,因为它使代码更容易阅读。