C 此链表程序中出现此分段错误的原因是什么?

C 此链表程序中出现此分段错误的原因是什么?,c,segmentation-fault,singly-linked-list,C,Segmentation Fault,Singly Linked List,当我添加最后一个节点时,这个程序总是给我一个分段错误,可能的原因是什么。它只是在添加最后一个节点时出现的,我已经对我得到分段错误的那行进行了注释。 我是编程新手 #include<stdio.h> #include<stdlib.h> struct node{ int data; struct node *next; }; struct node *createNode(int val){ struct node *r

当我添加最后一个节点时,这个程序总是给我一个分段错误,可能的原因是什么。它只是在添加最后一个节点时出现的,我已经对我得到分段错误的那行进行了注释。 我是编程新手

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

struct node{
        int data;
        struct node *next;
};


struct node *createNode(int val){
        struct node *ret=(struct node *)malloc(sizeof(struct node));
        ret->data=val;
        ret->next=NULL;
        return ret;
}


struct node *addNode(struct node *ll,int val){
        //Gives error here for the last node, it creates the node succesfull but this step give segmentation fault
        struct node *new_node=createNode(val);
        new_node->next=ll;
        return new_node;
}

void printList(struct node *ll){
        printf("printing list");
        struct node *temp=ll;
        while(temp->next){
                printf("%d ->",temp->data);
                temp=temp->next;
        }
}

int main(){
        struct node *head;
        head=addNode(head,3);
        head=addNode(head,5);
        head=addNode(head,1);
        head=addNode(head,9);
        printList(head);
}
#包括
#包括
结构节点{
int数据;
结构节点*下一步;
};
结构节点*createNode(int val){
结构节点*ret=(结构节点*)malloc(sizeof(结构节点));
ret->data=val;
ret->next=NULL;
返回ret;
}
结构节点*addNode(结构节点*ll,int val){
//此处给出最后一个节点的错误,它成功创建节点,但此步骤给出分段错误
结构节点*new_节点=createNode(val);
新建_节点->下一步=ll;
返回新的_节点;
}
无效打印列表(结构节点*ll){
printf(“打印列表”);
结构节点*temp=ll;
while(临时->下一步){
printf(“%d->”,临时->数据);
温度=温度->下一步;
}
}
int main(){
结构节点*头部;
head=addNode(head,3);
head=addNode(head,5);
head=addNode(head,1);
head=addNode(head,9);
印刷品清单(标题);
}
head
未初始化,因此使用未初始化的变量会导致未定义的行为。在添加节点之前,将
初始化为
NULL

 struct node *head = NULL;

head
未初始化,因此使用未初始化的变量会导致未定义的行为。在添加节点之前,将
初始化为
NULL

 struct node *head = NULL;

NULL
分配给头部

 struct node * head=NULL;
因为在addnode中,您是这样做的

 new_node->next=ll;
while(node){
...
}
然后在打印节点时,使条件如下所示

 new_node->next=ll;
while(node){
...
}
如果使用
节点>下一步
,将丢失链表中的最后一个值


malloc和家族。

NULL
分配给头部

 struct node * head=NULL;
因为在addnode中,您是这样做的

 new_node->next=ll;
while(node){
...
}
然后在打印节点时,使条件如下所示

 new_node->next=ll;
while(node){
...
}
如果使用
节点>下一步
,将丢失链表中的最后一个值


malloc和族。

您正面临此问题,因为在链接列表中添加新节点时,您正在添加此节点作为链接列表的开始

最初:

struct node* head; //This is not NULL.Big mistake by you.But this is not the only problem.
出现分段错误是因为您试图访问
printList()
中的无效内存位置,因为最后一个节点指针(首先由您声明为
head
)未指向任何有效内存位置。请尝试对调用
printList()进行注释
您将看到该错误出现。但这不是您正在寻找的解决方案,即使您将头部初始化为
NULL
,您将面临最后一个节点无法打印的问题。对于此用途:-

while(temp)

printList()

中,您将面临此问题,因为在链接列表中添加新节点时,您正在添加此节点作为链接列表的开始

最初:

struct node* head; //This is not NULL.Big mistake by you.But this is not the only problem.
出现分段错误是因为您试图访问
printList()
中的无效内存位置,因为最后一个节点指针(首先由您声明为
head
)未指向任何有效内存位置。请尝试对调用
printList()进行注释
您将看到该错误出现。但这不是您正在寻找的解决方案,即使您将头部初始化为
NULL
,您将面临最后一个节点无法打印的问题。对于此用途:-

while(temp)

printList()

中,您是否尝试通过调试器运行它?如果没有,请执行此操作并观察作用域中所有变量的值,查找可疑的内容。您可能希望在此处进行读取:我希望代码在此处崩溃:
printList()
您是否尝试通过调试器运行它?如果没有,则执行此操作并观察作用域中所有变量的值,查找可疑的内容。您可能希望在此处进行阅读:我希望代码在此处崩溃:
printList()