"Программа получила сигнал SIGSEGV, Ошибка сегментации."сообщение об ошибке от отладчика GDB - PullRequest
4 голосов
/ 30 сентября 2019

Что-то в цикле 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

1 Ответ

4 голосов
/ 30 сентября 2019

Проблема в том, что функция

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 );

Вот пример того, как можно определить функцию (я предполагаю, что функция добавляет узлы к своему хвосту).

int push(struct Node **list_head, int unique_id, float grade)
{
    struct Node *node = malloc( sizeof( struct Node ) );
    int success = node != NULL;

    if ( success )
    {
        node->player.id_number = unique_id;
        node->player.ratings   = grade; 
        node->next = NULL;

        while ( *list_head ) list_head = &( *list_head )->next;

        *list_head = node;
    }

    return success; 
}

Также этот цикл

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;
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...