Как я могу исправить эту проблему segfault при работе со связанными списками в C? - PullRequest
0 голосов
/ 01 мая 2019

Я работал над само-ссылочными структурами и связанными списками, в частности, для назначения Си. Проблема в том, что при попытке отменить ссылку на указатель на начало списка я получаю либо ошибку сегмента, либо «назначение из несовместимого типа указателя».

Я посмотрел на это объяснение по манипулированию связанными списками и попытался последовать их примеру при снятии ссылок на голову, но я продолжаю получать ошибку сегмента, когда делаю это. Я также использовал onlinegdb для отладки, segfaults пришел от:

new_node->next = (*h);
(*h) = new_node;
crawler = (*head_of_list);

поэтому я попытался избежать разыменования, он перестал работать с segfaulting, но все еще не работал. Он подумал, что разыменование главы списка было таким небольшим замешательством.

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


/*DATA STRUCTURES*/

typedef struct Node_s* Ptr_Node; /*Ptr_Node = pointer to struct node_s*/

typedef struct Node_s{
  int data;
  Ptr_Node next;
} Node_t;

typedef Ptr_Node* Head; /*a head = pointer to pointer of node*/

/*FUNCTIONS*/

/*Adds integer x in first position of the linked list*/
Head add_to_beginning(Head head_of_list, int x){
  Head h;
  h = head_of_list;
  Ptr_Node new_node;
  new_node = (Ptr_Node) malloc(sizeof(Node_t)); /*casting pointer type*/
  new_node->data = x;
  new_node->next = (*h); /*de-ref head to obtain pointer to first node*/
  (*h) = new_node; /*de-ref head to change what it points to*/
  return h;
}


void print_list(Head head_of_list){
  Ptr_Node crawler;
  crawler = (*head_of_list); /*points to first cell of list*/
  while(crawler != NULL){
    printf("%d\n", crawler->data );
    crawler = crawler->next;
  }
}

/*driver for testing*/
int main(void){
  Head h0, h1, h2;
  h0 = NULL;
  h1 = add_to_beginning(h0, 0);
  h2 = add_to_beginning(h1, 1);
  h3 = add_to_beginning(h2, 2);

  print_list(head_of_list);

  return 0;
}

Любая помощь о том, как обойти это очень ценится.

1 Ответ

3 голосов
/ 01 мая 2019

Вы определяете указатель головы как 0:

h0 = NULL;

Тогда вы разыменовываете это здесь:

new_node-> next = (* h);

Указатель указывает на нулевой адрес, и вы получаете ошибку. Убедитесь, что он указывает на действительную память:)

...