This question already has answers here:
Can a local variable's memory be accessed outside its scope?
                                
                                    (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