2

我正在实现一个链表库来自学 C。除了迭代之外,我的大多数事情都运行良好,它被用于我制作的长度函数。这是用于列表的结构

typedef struct ListNode ListNode;
typedef struct List List;

struct ListNode {
    void *val;
    ListNode *next;
};

struct List {
    ListNode *head;
};

我还有一些其他函数用于操作列表,即创建、推送和弹出函数。如果重要的话,这里是创建函数:

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/tposed/linked_list找到所有(不完全工作的)代码

4

1 回答 1

5

list_createhead初始化。 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;
}
于 2013-07-22T22:18:35.253 回答