树节点插入失败求助:文件处理仅插入一个节点后程序崩溃
问题排查:二叉树插入节点崩溃原因
核心错误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
相关产品推荐
相关产品推荐

