为什么我在C中的LinkedList插入方法中会出现分段错误
分段错误出现在“else if(head->next==NULL){”行。 我觉得我缺少了一些关于指针的基本知识 这是代码为什么我在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
#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分钟。