C-尝试将节点添加到链接列表的末尾会导致崩溃
我正在尝试用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
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)
(相应地更改其他赋值),还需要检查头
本身是否为空
。