这是我的学生结构,其中包含我通过二进制读取的信息

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


这就是我的主体的外观。我一直遇到分段错误,而我所看到的有关如何将双向链接列表写入二进制文件的所有示例都可以做到这一点。因此,我来​​这里解释为什么或可能会有一些变化。我在main中还声明了双向链表,将其声明为listPtr,将节点声明为node。

这是我的初始化

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


对于为什么发生这种情况的任何帮助,将不胜感激,我从来没有真正写过一个带有双向链表:/的二进制文件。

最佳答案

由于您没有显示更完整的代码,因此我只能猜测,但是问题是这样的:

double_linkedlist_t* listPtr;


看来这是在main函数内部声明的局部变量,而问题在于函数内部的局部变量未初始化。因此,通过具有声明并且不使指针实际指向某处,它将指向一个看似随机的位置。

未初始化的局部(非静态)变量将具有不确定的值,并且在不将指针指向任何有效位置的情况下取消引用指针将导致undefined behavior,这是导致崩溃的常见原因。

有两种可能的解决方案:


分配内存并使指针指向它:

double_linkedlist_t* listPtr = malloc(sizeof *listPtr);

不要将其声明为开头的指针,当需要一个指针时,请使用地址运算符&来获得一个:

double_linkedlist_t list;
list.headPtr = NULL;
list.tailPtr = NULL;

...

callSomeFunction(&list);

10-08 20:21