C EXC_BAD_ACCESS链接列表中的崩溃

时间:2014-10-15 14:02:46

标签: c linked-list

我在C中构建一个存储字符串的链表,并允许您搜索链表以查看元素是否存在。出于某种原因,每运行2-3次我使用包含大约6,000个元素的链接列表运行以下代码,我在以下行中出现EXC_BAD_ACCESS错误:

if (strcmp(list->value, value) == 0) return true;

EXC_BAD_ACCESS错误是由于它访问list->值。我不明白为什么会这样,因为我从来没有比LINE_BUFFER更大的字符串,并且在设置值指针之前将内存分配给堆。这意味着永远不应该释放那个内存,对吗?

我的行缓冲声明:

#define LINE_BUFFER 81

这是链接列表Node struct:

struct Node {
    struct Node *next;
    char *value;
};
typedef struct Node Node;

这是链表代码:

Node * create_node(Node *list, char *value) {

    Node *node = malloc(sizeof(Node));
    node->value = strcpy(malloc(sizeof(char) * LINE_BUFFER), value); // make sure value is on the heap

    // find the end of the list
    Node *end = NULL;
    while (list) {

        end = list;
        list = list->next;

    }

    // add this node to the end if necessary
    if (end) {

        end->next = node;

    }

    return node;

}

Node * init_list(char *value) {

    Node *node = create_node(NULL, value);
    return node;

}

Node * add_list(Node *list, char *value) {

    Node *node = create_node(list, value);
    return node;

}

bool search_list(Node *list, char *value) {

    while (list) {

        if (strcmp(list->value, value) == 0) return true;
        list = list->next;

    }
    return false;

}

void free_list(Node *list) {

    if (!list) return;

    Node *next = list->next;
    free(list->value);
    free(list);
    free_list(next);

}

1 个答案:

答案 0 :(得分:3)

您似乎永远不会在node->next中将NULL初始化为create_node。因此,遍历列表将取消引用未初始化的内存,并在包含无效指针时最终崩溃。