在C中尝试添加到链表末尾时出现Segfault



我试图在链表的末尾添加一个节点,但它触发了segfault,valgrind的进一步检查显示了一个无限的"Signal 11 droped from thread 0"循环。

我的.h文件:

#ifndef TEST_H
#define TEST_H
struct fruit {
    char name[20];
};
struct node {
    struct fruit * data;
    struct node * next;
};
struct list {
    struct node * header;
    unsigned count;
};
#endif

我的.c文件:

#include "test.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void init_list(struct list my_list)
{
    my_list.header = NULL;
    my_list.count = 0;
}
void add_to_list(struct list * my_list, struct node * fruit_node)
{
    struct node * current;  /* node to traverse list */
    if(my_list -> header -> next == NULL) { /* check if no other nodes have been inserted, if so, insert at head */
        my_list -> header -> next = fruit_node;
    } else  {
        current = my_list -> header;    /* start at header */
        while(current->next != NULL) {  /* loop will terminate once end of list is encountered */
            current = current -> next;
        }
        current = fruit_node;           /* add node */
    }
}
int main()
{
    struct fruit fruit_array[5];
    struct list fruit_list;
    struct node * my_node;
    strcpy(fruit_array[0].name, "Apple");
    strcpy(fruit_array[1].name, "Mango");
    strcpy(fruit_array[2].name, "Banana");
    strcpy(fruit_array[3].name, "Pear");
    strcpy(fruit_array[4].name, "Orange");
    init_list(fruit_list);
    my_node = malloc(sizeof(struct node));
    my_node -> data = &fruit_array[0];
    my_node -> next = NULL;
    add_to_list(&fruit_list, my_node);
    return 0;
}

为了全面披露,我早些时候试着发布了这个问题,一位用户建议我需要修改代码,通过引用而不是值传递给我的函数,我认为我已经这样做了,但我仍然会遇到同样的错误。

谢谢!

问题是我将值传递给init_list(),这导致我的列表的副本被初始化。

这随后导致add_to_list中的while循环无限循环,因为我的未初始化列表从未设置为null。

解决方案由rakib提供。

相关内容

  • 没有找到相关文章

最新更新