这是我的学生结构,其中包含我通过二进制文件读取的信息
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在我的主要内容中的样子。我一直遇到分段错误,所有关于如何将双向链表写入二进制文件的例子都可以实现。所以我来这里是为了解释为什么或者可能对我所拥有的一些改变。我还将我的双向链表在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;
}
对于为什么会发生这种情况的任何帮助都会非常感激,我从来没有真正写过带有双向链表的二进制文件:/。
答案 0 :(得分:1)
由于您没有显示更完整的代码,我只能猜测,但问题是:
double_linkedlist_t* listPtr;
这似乎是在main
函数内声明的局部变量,这个问题是函数内的局部变量没有被初始化。因此,通过声明并且不使指针实际指向某处,它将指向看似 随机 的位置。
未初始化的本地(非静态)变量将具有 indeterminate 值,并且取消引用指针而不使其指向任何有效位置将导致undefined behavior这是导致崩溃的常见原因
有两种可能的解决方案:
分配内存并使指针指向它:
double_linkedlist_t* listPtr = malloc(sizeof *listPtr);
不要将它声明为开头的指针,当需要指针时,使用地址运算符&
来获取一个:
double_linkedlist_t list;
list.headPtr = NULL;
list.tailPtr = NULL;
...
callSomeFunction(&list);