EXC_BAD 在 C 中将节点添加到链表时访问

EXC_BAD ACCESS when adding node to linked list in C

我正在尝试实现一个函数以在链表的末尾添加一个新节点,发现 here。但是,当 运行 Xcode 中下面的代码时,我在标有注释 //ERROR

的 if 语句处收到 EXC_BAD_ACCESS 错误

这是我第一次认真接触链表,谁能解释一下我做错了什么?

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct _node {
    int value;
    struct _node *next;
} node;

int addNodeBottom(int val, node *head);

int main(int argc, const char * argv[]) {
    node *head;
    head = NULL;

    for (int i = 1; i<11; i++) {
        addNodeBottom(i, head);
    }


    node *temp = head;
    while (head != NULL) {
        head = temp->next;
        free(temp);
        temp = head;
    }

    return 0;
}

int addNodeBottom(int val, node *head){

    //create new node
    node *newNode = (node*)malloc(sizeof(node));

    if(newNode == NULL){
        fprintf(stderr, "Unable to allocate memory for new node\n");
        exit(-1);
    }

    newNode->value = val;
    newNode->next = NULL;

    //check for first insertion
    if(head->next == NULL){                //ERROR
        head->next = newNode;
        printf("added at beginning\n");
    }

    else {
        //else loop through the list and find the last
        //node, insert next to it
        node *current = head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
        printf("added later\n");
    }
    return 0;
}

问题在于您取消引用了指向 NULL 的指针。见这里 main

head = NULL;

但是在函数中,您取消引用它 —

if(head->next == NULL){                //ERROR

而不检查 head 是否为 NULL。当 headNULL 时处理,如果不是 NULL 则继续。

head = NULL;
...
if(head->next == NULL)

因为这个。您应该首先将 head 初始化为有效指针。您的问题的可能解决方案是将 node** head 传递给函数而不是 node* headPtr 并检查 *headPtr == NULL 以便可以使用 head = NULL.