代码之家  ›  专栏  ›  技术社区  ›  jaaj

C-试图将节点添加到链表的末尾会导致崩溃[重复]

  •  -1
  • jaaj  · 技术社区  · 8 年前

    我试图在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的递归调用,因为我的程序在注释它时不会崩溃。为什么这会导致我的程序崩溃,我该如何修复它?

    1 回复  |  直到 8 年前
        1
  •  1
  •   caf    8 年前
    if(head->next == NULL){
        Node new;
        new.name = n;
        new.next = NULL;
        head->next = &new;
    }
    

    你的问题其实就在这里。变量 new 自动存储持续时间 ,这意味着它在声明它的块的末尾不再存在-在本例中,在本例末尾的右括号处 if()

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

    相反,您希望分配一个 Node 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()