This question already has answers here:
Can a local variable's memory be accessed outside its scope?
(20个答案)
2年前关闭。
我试图在C中实现一个链表。这是我对Node结构的定义,后面是一个将Node添加到链表末尾的函数。
我可以创建头节点并将其指针传递到addNode函数中,以便将第二个节点添加到链表中。 (还值得一提的是,当我创建头节点时,我将其“下一个”指针设置为NULL来表示链接列表的末尾)问题似乎在于在addNode函数的else分支中对addNode的递归调用,因为当我注释掉它时,我的程序可以正常运行而不会崩溃。为什么这会导致我的程序崩溃,该如何解决?
您的问题实际上在这里。变量
现在,您在
相反,您想要分配一个
使用
(20个答案)
2年前关闭。
我试图在C中实现一个链表。这是我对Node结构的定义,后面是一个将Node添加到链表末尾的函数。
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);
}
}
我可以创建头节点并将其指针传递到addNode函数中,以便将第二个节点添加到链表中。 (还值得一提的是,当我创建头节点时,我将其“下一个”指针设置为NULL来表示链接列表的末尾)问题似乎在于在addNode函数的else分支中对addNode的递归调用,因为当我注释掉它时,我的程序可以正常运行而不会崩溃。为什么这会导致我的程序崩溃,该如何解决?
最佳答案
if(head->next == NULL){
Node new;
new.name = n;
new.next = NULL;
head->next = &new;
}
您的问题实际上在这里。变量
new
具有自动存储持续时间,这意味着它在声明它的块的末尾不再存在-在这种情况下,在该if()
末尾的右括号处不存在。现在,您在
head->next
中保存的指针指向了一个不再存在的对象-这称为“悬空指针”。以后使用悬空指针时,不再定义程序的行为。相反,您想要分配一个
Node
,该malloc()
不能超出创建它的函数的调用-这就是malloc()
的用途:if(head->next == NULL) {
Node *new = malloc(sizeof *new);
if (new) {
new->name = n;
new->next = NULL;
head->next = new;
} else {
/* malloc failed */
}
}
使用
free()
创建的对象的生存期可以延长,直到将其传递给的指针为止,如果要从链接列表中删除Node并丢弃它,则将执行此操作。关于c - C-尝试将节点添加到链表的末尾会导致崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46313340/
10-11 02:32