You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:02:20