C &引用;程序接收信号SIGSEGV,分段故障。”;来自gdb调试器的错误消息

C &引用;程序接收信号SIGSEGV,分段故障。”;来自gdb调试器的错误消息,c,linked-list,singly-linked-list,segmentation-fault,C,Linked List,Singly Linked List,Segmentation Fault,while循环中的某些东西给了我这个错误。我不知道要查找什么,因为这个错误似乎是找到如何处理我的特定示例的常见方法 #include <stdlib.h> #include <stdio.h> /*Structure declarations*/ struct Data { int id_number; float ratings; }; typedef struct Node{ struct Data player; struct Nod

while循环中的某些东西给了我这个错误。我不知道要查找什么,因为这个错误似乎是找到如何处理我的特定示例的常见方法

#include <stdlib.h>
#include <stdio.h>
/*Structure declarations*/
struct Data {
    int id_number;
    float ratings;
};
typedef struct Node{
    struct Data player;
    struct Node *next;
}Node;

/*function declaration*/
void push(struct Node *list_head, int unique_id, float grade);
int main(){
    /* Initialize list_head to Null since list is empty at first */
    Node *list_head = NULL;     
    Node *traversalPtr;

    push(list_head, 1, 4.0);
    push(list_head, 2, 3.87);
    push(list_head, 3, 3.60);

    traversalPtr = list_head;
    while(traversalPtr -> next != NULL){
        printf("%d\n",traversalPtr -> player.id_number);
        traversalPtr = traversalPtr -> next;
    }   
}

...function declarations
#包括
#包括
/*结构声明*/
结构数据{
国际身份证号码;
浮动评级;
};
类型定义结构节点{
结构数据播放器;
结构节点*下一步;
}节点;
/*函数声明*/
无效推送(结构节点*列表头,整数唯一id,浮动等级);
int main(){
/*将列表头初始化为Null,因为列表最初为空*/
节点*列表头=空;
节点*traversalPtr;
推送(列表头,1,4.0);
推动(列表_头,2,3.87);
推动(列表_头,3,3.60);
traversalPtr=列表头;
while(traversalPtr->next!=NULL){
printf(“%d\n”,traversalPtr->player.id\u编号);
traversalPtr=traversalPtr->next;
}   
}
…函数声明

问题是函数

void push(struct Node *list_head, int unique_id, float grade);
处理main中定义的原始指针的副本,因为指针是通过值传递的

您应该像这样声明函数

void push(struct Node **list_head, int unique_id, float grade);
就这样说吧

push( &list_head, 1, 4.0 );
下面是一个如何定义函数的示例(我假设函数在尾部附加节点)

还有这个循环

traversalPtr = list_head;
while(traversalPtr -> next != NULL){
    printf("%d\n",traversalPtr -> player.id_number);
    traversalPtr = traversalPtr -> next;
}   
这是不正确的。应该是这样的

traversalPtr = list_head;
while(traversalPtr != NULL){
    printf("%d\n",traversalPtr -> player.id_number);
    traversalPtr = traversalPtr -> next;
}   

您需要将列表头的地址传递给push()。欢迎!请在你的问题中加入推送的定义。正如@VladfromMoscow所说,您的push函数声明/定义有问题。我要指出的是,
push
不一定是调用自己,因为没有提供
push
的定义,只是声明。我们确实需要
push()
的定义来最终回答这个问题@CodakBlack,是否可以将其编辑到您的问题中?如果您已经在调试器中运行了程序,并且出现了此错误,您应该可以确切地看到该错误的来源。在那里,您可以检查您的变量并检查预期值与实际值。
traversalPtr = list_head;
while(traversalPtr != NULL){
    printf("%d\n",traversalPtr -> player.id_number);
    traversalPtr = traversalPtr -> next;
}