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

标签 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 次循环迭代,如果它在类似循环中的前置函数之后运行(构建不同列表的 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/

相关文章:

python - Python 的 List 是如何实现的?

C 结构段溢出

javascript - 在运行时动态获取javascript中数组成员的名称

c - Windows 中 CMake 的默认生成器是什么?

c - malloc 内存到指向指针的指针

c - 如何允许使用 scanf 输入空格?

c++ - std::stack 是使用双链表实现的吗?

c - c中无法访问的语句

android - 在拨号器和通话记录之间切换时联系人应用程序崩溃

Java 库未添加到 Idea 中的运行时依赖项中