我试图在链表的末尾添加一个节点,但它触发了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提供。