0
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 次迭代构建不同的列表),则 append 循环只会在崩溃前达到 508 次。所以它看起来与内存有关,但我不确定。

4

2 回答 2

0

您的内存空间可能已用完。在这种情况下 malloc 不能分配内存并返回 NULL。您可以在初始化“链接”之前测试 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->next!=NULL”,但您从未初始化下一个属性。如果你用 malloc 分配内存,你只会得到空间。内存的内容是未定义的。所以你应该用link->next=NULL来初始化next-attribute。另一种可能性是calloc。calloc 与 malloc 一样分配内存,但 calloc 用 0 初始化内存。您可以使用 calloc(1,sizeof(Link))。如果内存空间不足,calloc 将返回 NULL。

于 2013-10-13T17:58:24.393 回答
0

我假设“崩溃”是指段错误。

首先,您没有设置link->nextNULL. 为 ,分配内存后linklink->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已正确初始化。

于 2013-10-13T16:17:39.413 回答