遍历链表时出现分段错误

Segmentation fault while looping through a linked list

我刚开始学习链表,我尝试创建一个函数,循环遍历链表并打印出每个值。

但是,在我的 while 循环结束时,当我经过最后一个节点时出现分段错误。

虽然我可以通过将条件从 (temp != NULL) 设置为 (temp->next != NULL) 来消除分段错误,但我仍然遇到错误。 我会在这里提供一些帮助。

我提供了出现错误的打印函数,但如果需要,我也可以提供完整的代码。

void printList(node_t *head){
    node_t *temp = head;

    if (temp != NULL) {
        while (temp->next != NULL) {
            int i = temp->value;
            printf("%d\n", i);
            temp = temp->next;
            
        }
    }
}

添加了更多代码。

#include <stdio.h>
#include <stdlib.h>

struct node{
    int value;
    struct node *next;
};

typedef struct node node_t;

void printList(node_t *head){
    node_t *temp = head;

    if (temp != NULL) {
        while (temp->next != NULL) {
            int i = temp->value;
            printf("%d\n", i);
            temp = temp->next;

        }
    }

}

node_t *create_new_node(int value){
    node_t *next_pointer = malloc(sizeof(node_t));
    next_pointer->value = value;
    next_pointer->next = NULL;
    return next_pointer;
}

node_t *insert_at_head(node_t **head, node_t *new_node){
    new_node->next = *head;
    *head = new_node;
    return new_node;
}

int main(){
    node_t *tmp, *head;

    for(int i= 0; i<25; i++){
        tmp = create_new_node(i);
        insert_at_head(&head, tmp);
    }
    
    printList(head);
    
    return 0;
}

程序的问题是你没有初始化指向头节点的指针

node_t *tmp, *head;

因此,随着新节点被添加到头部,最后一个节点的下一个数据成员具有不确定的值。

你需要写

node_t *tmp, *head = NULL;

函数printList可以看成下面的样子

void printList( const node_t *head )
{
    for ( ; head != NULL; head = head->next )
    {
        printf( "%d\n", head->value );
    }
}

函数 create_new_node 也应按以下方式定义

node_t * create_new_node( int value )
{
    node_t *next_pointer = malloc(sizeof(node_t));
    if ( next_pointer != NULL )
    {
        next_pointer->value = value;
        next_pointer->next = NULL;
    }

    return next_pointer;
}

初始化磁头:

node_t *tmp, *head=NULL;

这样最终成为最后一个 next 的内容定义明确,将阻止访问谁知道在哪里。

然后我得到一个很好的向后输出(减去最后一个元素,首先插入,0;见 Jabberwocky 的评论)。

例如这里 https://www.tutorialspoint.com/compile_c_online.php

否则你会:

head->OhNo
head->1->OhNo
head->2->1->OhNo
....

当它到达 at/before “OhNo” 时,这会启动你的输出函数,它指向谁知道的地方。

有了init就
头->NULL
head->1->NULL
head->2->1->NULL
...

后者与您的输出函数配合得很好。