void append(Link *link,LList *list)
{
Link *lastLink=NULL;
lastLink=list->head;
if(lastLink!=NULL)
{
while(lastLink->next!=NULL)
{
lastLink = lastLink->next;
}
lastLink->next=link;
}
else
{
list->head=link;
}
list->size++;
}
for(i=0;i<65000;i++)
{
link=(Link*)malloc(sizeof(Link));
link->value=i;
append(link,list2);
printf("%d\n",list2->size);
}
上面是一个链接列表的追加函数,其中相关的for循环调用它。我使用系统时钟来测试此功能的运行时间。当它自己运行时,它只会在崩溃之前经历循环的8264次迭代,并且如果它在类似循环中的prepend函数之后运行(65000次迭代构建不同的列表),则追加循环仅在崩溃之前达到508。所以它看起来与记忆有关,但我不确定。
答案 0 :(得分:0)
我假设“崩溃”你的意思是段错误。
首先,您没有将link->next
设置为NULL
。为link
分配内存后,link->next
包含垃圾值,您将无法找到列表的结尾。
另外,请注意您正在分配内存并且永远不会释放内存 - 您最有可能从堆内存中解脱出来。为避免这种情况,您应该测试malloc的返回值:
for(i=0;i<65000;i++)
{
if ((link = malloc(sizeof(Link))) == NULL) {
/* Out of memory */
fprintf(stderr, "Out of memory.\n");
/* Handle error... */
}
else {
link->value=i;
link->next = NULL;
append(link,list2);
printf("%d\n",list2->size);
}
}
我在循环体中添加了link->next = NULL
。您可能希望在append()
内进行此操作。我也从malloc中删除了演员,因为这通常是不好的做法。如果您尝试此操作但仍然崩溃,请确保list2
已正确初始化。
答案 1 :(得分:0)
你的记忆可能空间不足。在这种情况下,malloc无法分配Memory并返回NULL。您可以在初始化“link”之前测试malloc的返回值:
if ((link = malloc(sizeof(Link))) == NULL)
{
/* Error Handling: Memory ran out of space */
}
else
{
link->value=i;
append(link,list2);
printf("%d\n",list2->size);
}
另一个问题是你测试“lastLink-&gt; next!= NULL”,但你永远不会初始化next-attribute。如果你用malloc分配内存,你就得到了空间。内存的内容未定义。因此,您应该使用link-&gt; next = NULL初始化next-attribute。 另一种可能性是calloc。 calloc分配内存以及malloc,但是calloc用0初始化内存。你可以使用calloc(1,sizeof(Link))。如果内存中没有足够的空间,calloc将返回NULL。