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

打开文件时Program.exe停止运行,求以下C语言代码的问题排查建议

问题排查与修复建议

让我来帮你拆解这个问题,你的程序崩溃和逻辑错误主要出在两个核心点,咱们一步步来理清楚:

1. 直接导致崩溃的内存访问错误

你在formFile里的scanf("%s", name)传参完全错误:

  • name是char**类型(指向字符指针的指针),但scanf的%s格式符要求传入一个char*(指向字符缓冲区的指针)。
  • 你直接传name的话,相当于把指针本身的内存地址传给了scanf,它会把输入的字符串写到这个地址对应的内存区域——这属于非法的内存越界访问,必然触发程序崩溃。

修复方式:
把scanf的调用改成:

scanf("%s", *name);

⚠️ 注意:你必须确保*name已经指向了一块合法且足够大的内存缓冲区(比如提前声明数组char filename[256]; char** name = &filename;,或者用malloc动态分配空间),否则依然会出现内存问题。

2. doesFileExist函数的逻辑完全不符合预期

你当前的doesFileExist用"wb"模式调用fopen,这个模式的行为是:

  • 如果文件不存在:创建新文件并打开
  • 如果文件已存在:直接清空原文件内容并打开

这根本不是在“检查文件是否存在”,而是强制创建/覆盖文件。而且如果函数返回1(文件“存在”,实际是成功打开),你没有关闭这个文件句柄就直接return,会导致文件资源泄漏。

正确的文件存在性检查逻辑:
用只读模式"r"尝试打开文件,能打开说明文件存在,之后记得关闭句柄:

int doesFileExist(char *name, FILE ** f) {
    // 用只读模式尝试打开,验证文件是否存在且可访问
    if(NULL == (*f = fopen(name, "r"))) {
        return 0;
    }
    // 仅做存在性检查,不需要保持打开,立即关闭
    fclose(*f);
    *f = NULL; // 重置指针,避免后续误操作
    return 1;
}

3. 额外的注意事项

  • 如果你的需求是创建一个不存在的新文件,在确认文件不存在后,再用"wb"或"w"模式打开。
  • 处理文件名输入时,最好限制输入长度(比如用scanf("%255s", *name)),避免缓冲区溢出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:16:33