为什么我在C中的LinkedList插入方法中会出现分段错误

为什么我在C中的LinkedList插入方法中会出现分段错误,c,C,分段错误出现在“else if(head->next==NULL){”行。 我觉得我缺少了一些关于指针的基本知识 这是代码 #include <stdio.h> #include <stdlib.h> typedef struct Node{ int value; struct Node* next; }Node; void insert(Node* head, int value){ if(head == NULL){ hea

分段错误出现在“else if(head->next==NULL){”行。 我觉得我缺少了一些关于指针的基本知识

这是代码

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

typedef struct Node{
    int value;
    struct Node* next;
}Node;

void insert(Node* head, int value){
    if(head == NULL){
        head = (Node*)malloc(sizeof(struct Node));
        head -> value = value;
        head -> next = NULL;
    }else if(head -> next == NULL){
        printf("good\n");
        head -> next = (Node*)malloc(sizeof(struct Node));
        head -> next -> value = value;
        head -> next -> next = NULL;
    }else{
        insert(head -> next, value);
    }
}

int main(){
    struct Node* head;
    head = NULL;
    insert(head, 3);
    insert(head, 4);
    printf("%d\n", head -> value);
    return 0;
}
#包括
#包括
类型定义结构节点{
int值;
结构节点*下一步;
}节点;
空插入(节点*头,int值){
if(head==NULL){
head=(节点*)malloc(sizeof(结构节点));
头->值=值;
head->next=NULL;
}else if(head->next==NULL){
printf(“良好”);
head->next=(节点*)malloc(sizeof(结构节点));
head->next->value=value;
head->next->next=NULL;
}否则{
插入(头->下一步,值);
}
}
int main(){
结构节点*头部;
head=NULL;
插入(头,3);
插入(头,4);
printf(“%d\n”,头->值);
返回0;
}

实际的分段错误发生在
main
中,而不是
insert
中。问题是,在
main
中,您从未更新
head
。它被初始化为
NULL
,并且在两次调用
insert
后仍保持
NULL
。分段错误发生在您尝试时在
printf
中取消引用的pt:

printf("%d\n", head -> value);
由于
head
NULL
,因此您将遇到分段错误

问题是,
insert
仅更新其自身的
head
本地副本。此更改不会反映在调用方中,即
main

您从未看到从
insert
打印的“good”的原因是,在调用
insert
时,您总是为
head
传递一个
NULL

有两种常见的解决方法。一种是更改
insert
以始终返回指向新列表头的指针。然后调用方用返回值更新其列表头,例如

head = insert(head, 3);
另一种方法是将insert更改为获取指向头部指针的指针,并在返回之前对其进行修改。因此,您的调用如下所示:

insert(&head, 3);
insert
的原型如下所示

void insert(Node **head_ptr, int value)
insert
中,调用方的
head
副本将通过以下操作进行更新:

*head_ptr = head;

C,是一种不同的语言。C++不属于不同的语言。不要在C++中转换<代码> MalOC 和朋友的结果。它的C程序我并不是要把它标记为C++,仔细地通过代码,使用调试器。错误是显而易见的。是的,使用调试器。如果您有效地使用调试器,则需要2分钟。