Написание двусвязного списка с ошибками сегментации двоичного файла

Это моя студенческая структура с информацией, которую я читаю через двоичный файл

   typedef struct student_t {

     //data in here

     } student_t;

вот как я их объявил в основном

double_linkedlist_t* listPtr;
student_t students;
node_t* node = NULLL;

так инициализируется мой файл

FILE *file;
printf("What file would you like to select?\n");
fgets( filename, MAX_NAME_LENGTH, stdin );
strtok(filename, "\n");
fflush(stdin);
file = fopen(filename, "rb+wb");

Вот как мой fwrite выглядит в моей главной. Я продолжаю получать ошибку сегментации, и все примеры, которые я видел о том, как записать двусвязный список в двоичный файл, заставили вас сделать это. Поэтому я прихожу сюда для объяснения того, почему или, может быть, какие-то изменения в том, что у меня есть. У меня также есть мой двусвязный список, объявленный как listPtr в main, и мой узел как узел.

это мой иници

     node_t* Init_Node( student_t data ) 
     {
       node_t* node = (node_t*) malloc( sizeof( node_t ) );
       node -> students = data;
       node->nextPtr = NULL; 
       node->prevPtr = NULL;
       return node;
     }

это моя структура узла вместе с прототипом для nodeinit

     typedef struct node_t
     {
       student_t students;
       struct node_t* nextPtr;
       struct node_t* prevPtr;
      } node_t;

     //prototypes
     node_t* Init_Node( student_t );


            node = listPtr->headPtr; //segmentation faults here
            while(node!=NULL)
            {
                fwrite(node, sizeof(student_t), 1, file);
                node=node->nextPtr; 
            }

любая помощь в том, почему это происходит, будет принята с благодарностью, я никогда не писал в двоичный файл с двусвязным списком:/.

1 ответ

Решение

Поскольку вы не показываете более полный код, я смогу только догадываться, но проблема заключается в следующем:

double_linkedlist_t* listPtr;

Кажется, это локальная переменная, объявленная внутри main функция, и проблема в том, что локальные переменные внутри функций не инициализируются. Таким образом, имея объявление и не заставляя указатель фактически указывать куда-либо, он будет указывать на кажущееся случайным место.

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

Есть два возможных решения:

  1. Выделите память и сделайте указатель на нее:

    double_linkedlist_t* listPtr = malloc(sizeof *listPtr);
    
  2. Не объявляйте его как указатель для начала, а когда указатель необходим, используйте оператор адреса & чтобы получить:

    double_linkedlist_t list;
    list.headPtr = NULL;
    list.tailPtr = NULL;
    
    ...
    
    callSomeFunction(&list);
    
Другие вопросы по тегам