我正在实现一个链表库来自学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;
}