链表-Free()节点导致程序崩溃

时间:2018-12-23 11:16:35

标签: c memory-management linked-list

我不熟悉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));
}

2 个答案:

答案 0 :(得分:1)

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

必须

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

当然还有a = start;没用

{edit}

附加说明,执行if(j==2) { a -> link = NULL; }是一个错误的选择,因为再次测试 j 的值后,如果必须更改循环数,则必须执行2变化。最好将其删除并在循环后直接添加a -> link = NULL;(无需测试)

答案 1 :(得分:1)

替换此:

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

具有:

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

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