我在C中的链表计数函数出现地址边界错误



我正在实现一个链表库来自学C。除了迭代,我的大多数事情都做得很好,迭代用于我所做的长度函数。以下是用于列表的结构

typedef struct ListNode ListNode;
typedef struct List List;
struct ListNode {
    void *val;
    ListNode *next;
};
struct List {
    ListNode *head;
};

我还有另外几个用于操作列表的函数,即create、push和pop函数。如果重要的话,下面是创建函数:

List *list_create(){
    List *list = malloc(sizeof *list);
    return list;
}

以下是出现问题的功能:

int list_length(List *list){
    ListNode *current = list->head;
    int count = 0;
    // Iterate through the list, adding to the count
    while(current != NULL){
        count++;
        current = current->next;
    }
    return count;
}

由于某种原因,当它到达最后一次迭代时,while谓词不起作用,相反,我得到了以下错误:

Job 1, './linked_list ' terminated by signal SIGSEGV (Address boundary error)

有没有什么事情能立即表明我做错了?您可以在https://github.com/tominated/linked_list

list_create使head未初始化。list_push(在github代码中)创建一个新项,并将head设置为其next指针。当您遍历列表时,最后一项指向这个未初始化的指针,而不是NULL。从这一点开始,你进入了未定义的行为;你很快就会得到SIGSEGV的几率很高。

修复方法很简单——您只需要在创建列表时将head设置为NULL

List *list_create(){
    List *list = malloc(sizeof *list);
    if (list != NULL) {
        list->head = NULL;
    }
    return list;
}

相关内容

  • 没有找到相关文章

最新更新