C Linked List-Free()节点导致程序崩溃

C Linked List-Free()节点导致程序崩溃,c,memory-management,linked-list,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

我不熟悉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));
}
#包括
#包括
#包括
类型定义结构列表
{
int数据;
结构列表*链接;
}节点;
node*createnode();
int main()
{
node*a=createnode();//创建第一个节点
节点*start=a;
printf(“第一个节点的值:”);
scanf(“%d”,&a->data);
对于(int j=0;jlink=createnode();
a=a->link;
printf(“节点%d的值:,j+1”);
scanf(“%d”,&a->data);
如果(j==2)
{
a->link=NULL;
}
}
a=启动;
while(a!=NULL)
{
printf(“%d->”,a->data);
a=a->link;
如果(a==NULL)
{
printf(“空”);
}
}
a=启动;
while(a!=NULL)
{
a=启动;
开始=一个->链接;
免费(a);
}
返回0;
}
节点*createnode()
{
返回malloc(sizeof(node));
}
一定是

while(start != NULL)
{
    a = start;
    start = a -> link;
    free(a);
}
当然,
a=start;
就在前面是没有用的

{编辑}

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

替换此项:

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


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

@kiner_-shah否,
a->link=createnode();
在下一个循环中完成,否则内存会泄漏谢谢我知道了!是的,谢谢提示:)
    a = start;
    while(a != NULL)
    {
        a = start;
        start = a -> link;
        free(a);
    }
    while(start != NULL)
    {
        a = start;
        start = a -> link;
        free(a);
    }