将节点添加到C中的链表时EXC_BAD ACCESS

时间:2015-11-14 07:37:34

标签: c linked-list exc-bad-access

我正在尝试实现一个函数,在链接列表的末尾添加一个新节点,找到here。但是,在Xcode中运行下面的代码时,我在标记为注释//错误

的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;
}

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

问题是您取消引用指向NULL的指针。请参阅main -

head = NULL;

但是在功能上,你取消引用它 -

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

不检查head是否为NULL。处理head NULL时的情况,如果不是NULL则继续处理。