C 这段代码一直有seg故障
我试图在C中实现一个链表。有一个结构列表,它有指向列表第一个和最后一个位置的空指针。具有指向数据的空指针和指向下一个数据的结构节点指针的结构节点。由于某些原因,当我尝试访问结构列表前指针时,它会出现seg错误。这是代码。任何帮助都将不胜感激 (main方法将传递到函数中的列表初始化为null) 您正在将空指针(C 这段代码一直有seg故障,c,pointers,struct,linked-list,C,Pointers,Struct,Linked List,我试图在C中实现一个链表。有一个结构列表,它有指向列表第一个和最后一个位置的空指针。具有指向数据的空指针和指向下一个数据的结构节点指针的结构节点。由于某些原因,当我尝试访问结构列表前指针时,它会出现seg错误。这是代码。任何帮助都将不胜感激 (main方法将传递到函数中的列表初始化为null) 您正在将空指针(linked\u list)传递到list\u add()中。然后在list\u add()中取消引用该指针,导致崩溃 内 ListSub Ad()/代码>,在上面考虑类似的事情: str
linked\u list
)传递到list\u add()
中。然后在list\u add()
中取消引用该指针,导致崩溃
内<代码> ListSub Ad()/代码>,在上面考虑类似的事情:
struct list *list_add(struct list *li, void *d){
struct node *new_node;
if (!li) {
li = malloc(sizeof(*li));
li->front = li->back = NULL;
}
new_node = malloc(sizeof(struct node));
...
你可能还需要做更多的事情,但这会让你越过第一个障碍。另外请注意,在调用
list\u add()
之前,可以在main()
中进行类似的初始化。首先,我认为这不是创建链表的正确方法,不需要列表结构
int main()
{
struct list *linked_list;
linked_list = NULL;
int *ptr;
int x = 5;
ptr = &x;
linked_list = list_add(linked_list,ptr);
}
struct list {
void *front;
void *back;
};
struct node{
void *data;
struct node *next;
struct node *prev;
};
struct list *list_add(struct list *li, void *d){
//you need to check if li is null if so initialize it
if(li ==null){
li = (struct list*) malloc(sizeof(struct list));
}
struct node *new_node;
new_node = (struct node *)malloc(sizeof(struct node));
if(new_node == NULL){
printf("Malloc failed");
exit(1);
}
new_node->data = d;
new_node->next = NULL;
struct node *cur;
for(cur = li->front; cur != NULL; cur = cur->next){
if(cur->next == NULL){
new_node->prev = cur;
}
}
li->front = new_node;
return li;
}
但是,与其在函数中检查null,不如让list_add成为一个void并传入一个初始化列表这实际上不是链接列表的正确实现。根据您指出的问题所在,您的
li
无效。如果看不到您是如何调用list\u add()
,就不可能确切地知道是什么导致了崩溃。@mah我刚刚更新了它以包含主方法如何修复它?列表最初为空。如果我做了li.front=new_node,我会得到一个错误。我有一个建议的方法,在我的答案中修复它,检查NULL,并在该条件下运行几行,以创建一个有效的列表结构。在此代码中不能使用li.front
,因为li
是指针,而不是结构。必须li->front=new\u节点代码>。非常感谢。我现在让它工作了。出于好奇,如果它是一个指针,我们为什么要使用它呢?指针必须指向某个有用的东西……当你声明一个指针时,你没有为它必须指向的东西留出空间(在本例中是结构列表)。malloc()是分配空间的一种方法。然而,在您的情况下,另一个可行的解决方案可能是声明(主要)struct list linked\u list
(不是指针),然后调用list\u add(&linked\u list,…)
——除非您的list\u add返回您想要的指针。尽管您没有在列表添加中修改指针,所以看起来它可以进行小的修改。
struct list *list_add(struct list *li, void *d){
struct node *new_node;
if (!li) {
li = malloc(sizeof(*li));
li->front = li->back = NULL;
}
new_node = malloc(sizeof(struct node));
...
int main()
{
struct list *linked_list;
linked_list = NULL;
int *ptr;
int x = 5;
ptr = &x;
linked_list = list_add(linked_list,ptr);
}
struct list {
void *front;
void *back;
};
struct node{
void *data;
struct node *next;
struct node *prev;
};
struct list *list_add(struct list *li, void *d){
//you need to check if li is null if so initialize it
if(li ==null){
li = (struct list*) malloc(sizeof(struct list));
}
struct node *new_node;
new_node = (struct node *)malloc(sizeof(struct node));
if(new_node == NULL){
printf("Malloc failed");
exit(1);
}
new_node->data = d;
new_node->next = NULL;
struct node *cur;
for(cur = li->front; cur != NULL; cur = cur->next){
if(cur->next == NULL){
new_node->prev = cur;
}
}
li->front = new_node;
return li;
}