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 次循环迭代,如果它在类似循环中的前置函数之后运行(构建不同列表的 65000 次迭代),则追加循环在崩溃之前只会达到 508 次。所以它看起来与内存有关,但我不确定。
最佳答案
我假设“崩溃”指的是段错误。
首先,您没有将 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
已正确初始化。
关于只能通过这个循环这么多次迭代吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19347215/