gpt4 book ai didi

c - 解决 C 中链表计数函数的边界错误

转载 作者:行者123 更新时间:2023-12-02 21:56:06 26 4
gpt4 key购买 nike

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

关于c - 解决 C 中链表计数函数的边界错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17798290/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com