只能通过这个循环的这么多次迭代?

时间:2013-10-13 16:02:33

标签: c linked-list runtime

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。所以它看起来与记忆有关,但我不确定。

2 个答案:

答案 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。