C语言通过引用传递FILE指针调用文件写入函数时程序崩溃
C语言写入TXT文件fputs崩溃排查方案
核心问题排查点
- 无意义的二级FILE指针引入风险
你的saveTXT函数全程没有修改FILE指针指向的操作(没有重新赋值*txt的代码),完全不需要传递二级指针。二级指针如果调用时传参错误,会导致*txt指向非法地址,触发fputs段错误。 - 缓冲区溢出隐患
直接用strcat(strcpy(buffer,n->data),"\n")没有做长度校验,如果n->data长度超过98字节,会超出100字节的buffer栈空间,改写栈上的其他数据(包括保存的FILE指针值),就算能正常打印buffer,也可能在后续调用fputs时拿到已经被破坏的文件指针,导致崩溃。 - 未定义行为破坏IO状态
fflush(stdin)是C标准明确的未定义行为,仅部分编译器支持该操作,执行后可能破坏标准IO库的内部状态,导致后续文件操作异常崩溃,你代码里这行没有任何实际作用,直接删除即可。 - 缺少文件指针有效性校验
仅校验调用前打开成功不够,递归过程中如果出现IO错误会导致文件指针失效,建议操作文件前先校验指针有效性。
修复后的代码示例
改造后的saveTXT函数
// 改为传递一级FILE指针即可 void saveTXT(FILE* txt, node* n) { char buffer[100]; // 先校验文件指针有效性 if (txt == NULL) { return; } if(n == NULL) { fprintf(txt, "*\n"); return; } // 用snprintf安全拼接字符串,自动避免溢出 snprintf(buffer, sizeof(buffer), "%s\n", n->data); printf("This is the string to be saved: %s\n", buffer); fputs(buffer, txt); // 递归直接传递一级指针 saveTXT(txt, n->right); saveTXT(txt, n->left); }
调用示例
// 打开文件后务必加校验 FILE* doc = fopen("your_file.txt", "w"); if (doc == NULL) { perror("文件打开失败"); return; } // 直接传递一级指针,不需要取地址 saveTXT(doc, root_node); // 操作完成后关闭文件 fclose(doc);
内容的提问来源于stack exchange,提问作者Alexis M.Rosales
相关产品推荐
相关产品推荐

