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

树节点插入失败求助:文件处理仅插入一个节点后程序崩溃

问题排查:二叉树插入节点崩溃原因

核心错误1:新节点未初始化左右指针

你的userTree函数中,用malloc分配新节点内存后,没有将left和right指针初始化为NULL。malloc返回的内存是未初始化的随机垃圾值,后续递归插入时会把这些野指针当作有效节点访问,直接触发程序崩溃。

修正后的userTree函数:

user *userTree(char username[], int money, char favorite[]) {
    user *newBranch = (user *) malloc(sizeof(user));
    // 初始化左右指针为NULL,避免野指针
    newBranch->left = NULL;
    newBranch->right = NULL;
    strcpy(newBranch->favorite, favorite);
    strcpy(newBranch->username, username);
    newBranch->money = money;
    return newBranch;
}

核心错误2:文件读取逻辑错误(加剧崩溃)

虽然你提到存链表正常,但文件读取的写法存在严重问题,会导致最后一次循环读取无效垃圾数据,传入树插入函数后触发崩溃:

  • while (!feof(fr))是错误的循环写法:feof只有在读取操作失败后才会被置位,因此最后一次循环会执行读取,但此时已到文件末尾,读取的username、favorite等变量是未定义的垃圾值,传给insertUser后,strcmp访问非法内存直接崩溃。
  • fscanf格式串中的换行符写法错误,应为%[^\n],拆分的写法会导致读取时无法正确处理行尾。

修正后的文件读取函数:

void insertCredential() {
    FILE* fr = fopen("users/users.txt", "r");
    if (!fr) { // 增加文件打开失败判断,避免空指针访问
        perror("Failed to open file");
        return;
    }
    char username[50], garbage[50], favorite[50];
    int money;
    // 用fscanf的返回值判断是否读取成功,替代feof
    while (fscanf(fr, "%[^#]#%[^#]#%d#%[^\n]", username, garbage, &money, favorite) == 4) {
        root = insertUser(root, username, money, favorite);
        puts("test insert");
    }
    fclose(fr);
}

额外建议

  • 每次malloc后检查是否分配成功,避免内存不足导致空指针访问:
    user *newBranch = (user *) malloc(sizeof(user));
    if (!newBranch) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    
  • 确保输入文件格式严格匹配%[^#]#%[^#]#%d#%[^\n],每条记录用#分隔且独占一行,避免读取失败。

内容的提问来源于stack exchange,提问作者Arigatod

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:41:18