0

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

   typedef struct student_t {

     //data in here

     } student_t;

这就是我在 main 中声明它们的方式

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 在我的 main 中的样子。我不断遇到分段错误,我看到的所有关于如何将双向链表写入二进制文件的示例都让你这样做了。所以我来这里是为了解释我所拥有的原因或可能会发生一些变化。我还将我的双向链表声明为 main 中的 listPtr,并将我的节点声明为节点。

这是我的初始化

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

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

4

1 回答 1

1

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

double_linkedlist_t* listPtr;

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

未初始化的本地(非静态)变量将具有不确定的值,并且取消引用指针而不使其指向任何有效的位置将导致未定义的行为,这是导致崩溃的一个非常常见的原因。

有两种可能的解决方案:

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

    double_linkedlist_t* listPtr = malloc(sizeof *listPtr);
    
  2. 不要将其声明为开头的指针,当需要指针时,请使用 address-of 运算符&来获取:

    double_linkedlist_t list;
    list.headPtr = NULL;
    list.tailPtr = NULL;
    
    ...
    
    callSomeFunction(&list);
    
于 2015-03-10T04:24:06.470 回答