C语言如何从二进制文件读取链表?代码段错误求助
链表读取二进制文件段错误的问题排查与修复
兄弟,我瞅了瞅你贴的代码片段,能发现几个明显的坑导致段错误,咱一个个拆解:
1. 变量名不匹配的低级错误
你函数参数是struct link **headptr,但代码里写的是struct link *head = *rootptr;——rootptr根本没定义啊!这里应该用*headptr才对,不然编译器要么报错,要么误用野指针直接触发段错误。
2. 空指针直接解引用
如果传入的*headptr(也就是链表头)一开始是NULL,那head = *headptr之后head也是NULL,你直接去访问head->next,这不就是空指针解引用吗?绝对会触发段错误!
3. 没检查文件是否打开成功
如果numbers.bin不存在或者权限不够,fopen会返回NULL,你后续直接操作这个空文件指针,也会导致崩溃,必须先判断文件是否打开成功。
4. 读取逻辑完全搞反了
你现在的逻辑是遍历已经存在的链表,但我们是要从文件重建链表啊!应该是先从文件读数据,再创建新节点,然后把节点链接到链表上,而不是先遍历一个可能为空的链表。
修正后的示例代码
#include <stdio.h> #include <stdlib.h> // 假设你的链表节点结构是这样的,按需调整 struct link { int data; // 示例数据字段,替换成你实际的字段 struct link *next; }; void readlist(struct link **headptr) { // 1. 先检查文件是否打开成功 FILE *fp = fopen("numbers.bin", "rb"); if (fp == NULL) { perror("Failed to open file"); return; } struct link *current = NULL; struct link *newlink; int data; // 对应你写入文件的数据字段,按需调整 // 2. 循环读取文件数据,直到文件结束 while (fread(&data, sizeof(int), 1, fp) == 1) { // 3. 为新节点分配内存 newlink = (struct link *)malloc(sizeof(struct link)); if (newlink == NULL) { perror("Failed to allocate memory"); fclose(fp); return; } newlink->data = data; newlink->next = NULL; // 4. 将新节点链接到链表中 if (*headptr == NULL) { // 链表为空,新节点作为头节点 *headptr = newlink; current = newlink; } else { // 追加到链表尾部 current->next = newlink; current = newlink; } } fclose(fp); }
额外注意事项
- 确保读写格式一致:如果你写入文件时是直接写整个节点结构体,那读取时要对应使用
fread(newlink, sizeof(struct link), 1, fp),但要注意结构体里的指针字段不能直接写入文件(指针是内存地址,重启程序后无效),只能写入实际数据字段。 - 记得在使用完链表后遍历释放所有节点内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者P3X-774
相关产品推荐
相关产品推荐

