struct node {
int value;
struct node* next;
};
struct node* alloc_node() {
return malloc(sizeof(struct node));
}
int get_count(struct node* head) {
int node_count;
struct node* iterator;
node_count = 1;
iterator = head;
while (iterator->next != NULL) {
iterator = iterator->next;
node_count++;
}
return node_count;
}
我正在从头开始构建一个链接列表,以便更好地理解C语言。程序编译但在运行时会出现分段错误。这在get_count()方法实现后开始发生。关于为什么会发生这种情况的任何想法?下面是调用方法的地方:
#include <stdio.h>
#include <stdlib.h>
#include "linked_list.c"
int main() {
// create head
struct node* head;
head = alloc_node();
// create first node
struct node* link;
link = alloc_node();
link->value = 5;
(*head).next = link;
int size = get_count(head);
printf("%d\n", size);
return 0;
}
答案 0 :(得分:2)
struct node* alloc_node() {
return malloc(sizeof(struct node));
}
您返回未初始化的节点。什么保证next
被初始化为NULL,以便您稍后在get_count
中进行检查?
明确地初始化它:
struct node* alloc_node() {
struct node* ret = malloc(sizeof *ret);
if (ret) {
ret->next = NULL;
}
return ret;
}
为软件库编写API时的经验法则是,您所做的每个假设都必须由库本身记录或强制执行。用户不知道的隐含假设不是编程的良好基础。