【问题标题】:Linked List - Free() nodes causes program to crash链表 - Free() 节点导致程序崩溃
【发布时间】:2019-05-23 00:14:18
【问题描述】:

我是 c 中链表的新手,并在 c 中编写了一个小程序,创建节点,当我尝试释放分配的内存时,我的程序崩溃了。我不知道是什么导致了这个错误,所以我希望你能帮助我。我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct list
{
    int data;
    struct list *link;
} node;
node *createnode();
int main()
{
    node *a = createnode(); //create first node
    node *start = a;
    printf("Value of first node: ");
    scanf("%d", &a->data);
    for(int j = 0; j<3; j++) //create three nodes
    {
        a->link = createnode();
        a = a -> link;
        printf("Value of node %d: ", j+1);
        scanf("%d", &a->data);
        if(j==2)
        {
            a -> link = NULL;
        }
    }
    a = start;
    while(a != NULL)
    {
        printf("%d -> ", a->data);
        a = a -> link;
        if(a==NULL)
        {
            printf("null");
        }
    }
    a = start;
    while(a != NULL)
    {
        a = start;
        start = a -> link;
        free(a);
    }



    return 0;
}
node *createnode()
{
    return malloc(sizeof(node));
}

【问题讨论】:

  • @kiner_shah 不,a-&gt;link = createnode(); 完成下一个循环,否则存在内存泄漏

标签: c memory-management linked-list


【解决方案1】:

替换这个:

    a = start;
    while(a != NULL)
    {
        a = start;
        start = a -> link;
        free(a);
    }

与:

    while(start != NULL)
    {
        a = start;
        start = a -> link;
        free(a);
    }

在原始循环中,a 未经测试就被设置为新值。

【讨论】:

    【解决方案2】:
    while(a != NULL)
    {
        a = start;
        start = a -> link;
        free(a);
    }
    

    必须

    while(start != NULL)
    {
        a = start;
        start = a -> link;
        free(a);
    }
    

    当然之前的a = start;是没用的

    {编辑}

    附加说明,做if(j==2) { a -&gt; link = NULL; } 是一个糟糕的选择,因为在你再次测试 j 的值之后,如果你必须改变循环次数,你必须做 2 次改变。最好删除它并在循环之后直接添加a -&gt; link = NULL;(无需测试)

    【讨论】:

    • 谢谢我知道了!是的,你是对的,谢谢你的提示:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 1970-01-01
    • 2012-07-20
    • 2021-03-02
    • 2019-04-04
    • 2015-06-28
    相关资源
    最近更新 更多