C-尝试将节点添加到链接列表的末尾会导致崩溃

C-尝试将节点添加到链接列表的末尾会导致崩溃,c,pointers,linked-list,nodes,C,Pointers,Linked List,Nodes,我正在尝试用C实现一个链表。下面是我对节点结构的定义,后面是一个用于将节点添加到链表末尾的函数 struct Node{ char *name; struct Node *next; }; typedef struct Node Node; void addNode(Node *head, char n[100]){ if(head->next == NULL){ Node new; new.name = n; ne

我正在尝试用C实现一个链表。下面是我对节点结构的定义,后面是一个用于将节点添加到链表末尾的函数

struct Node{
    char *name;
    struct Node *next;
};
typedef struct Node Node;

void addNode(Node *head, char n[100]){
    if(head->next == NULL){
        Node new;
        new.name = n;
        new.next = NULL;
        head->next = &new;
    }
    else{
        addNode(head->next, n);
    }
}
我可以创建一个head节点并将其指针传递到addNode函数中,只需将第二个节点添加到链表中即可。(同样值得一提的是,当我创建一个head节点时,我将其“next”指针设置为NULL以表示链表的末尾)问题似乎在于addNode函数的else分支中对addNode的递归调用,因为我的程序在注释它时不会崩溃。为什么这会导致我的程序崩溃,我如何修复它

if(head->next == NULL){
    Node new;
    new.name = n;
    new.next = NULL;
    head->next = &new;
}
你的问题其实就在这里。变量
new
具有自动存储持续时间,这意味着它不再存在于声明它的块的末尾-在本例中,在该
if()末尾的右括号处

保存在
head->next
中的指针现在指向一个不再存在的对象-这称为“悬空指针”。当您以后使用悬挂指针时,程序的行为不再被定义

相反,您希望分配一个
节点
,该节点将超出创建它的函数的调用范围-这就是
malloc()
的用途:

if(head->next == NULL) {
    Node *new = malloc(sizeof *new);

    if (new) {
        new->name = n;
        new->next = NULL;
        head->next = new;
    } else {
        /* malloc failed */
    }
}

使用
malloc()
创建的对象的生存期将一直延长,直到您将指向该对象的指针传递到
free()
,如果您要从链接列表中删除节点并将其丢弃,则会执行此操作。

您在
addNode
中使用局部变量。当您从函数返回时,它将超出范围。因此,下次调用该函数时,可能会导致崩溃。此外,您还需要为
名称
分配单独的内存,并使用strcpy将
n
复制到
名称
节点新建;-->Node*new=malloc(sizeof*new)
(相应地更改其他赋值),还需要检查
本身是否为