列表大小的链接列表分段错误

时间:2017-03-07 17:22:28

标签: c

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;
}

1 个答案:

答案 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时的经验法则是,您所做的每个假设都必须由库本身记录或强制执行。用户不知道的隐含假设不是编程的良好基础。