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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:06:05