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

C语言将文件名作为函数参数传递,文件不存在时触发段错误

问题根本原因
  • 空指针调用fclose:当目标文件不存在时,fopen会返回NULL并赋值给fp,你的代码没有判断fp是否有效就直接执行fclose(fp),对空指针执行fclose属于C语言标准定义的未定义行为,这是触发段错误的直接原因。
  • 代码笔误:runFile函数的形参名为file,但你在函数开头判断的是if (!filename),filename属于未声明的标识符,在部分宽松编译环境下可能被默认当做int类型处理,会引发不可预期的内存访问问题。
  • 重复IO操作冗余:你先后两次调用fopen打开同一个文件,第一次打开的文件指针没有被保存也没有被关闭,会造成文件资源泄漏。
修复方案

你只需要修正变量名笔误、仅在文件打开成功时执行关闭操作即可,修复后的代码如下:

#include <stdio.h>
#include <stdlib.h>

void runFile(char* file);

int main(int argc, char** argv)
{   
    if (argc != 2)
    {   
        printf("Usage: ./lexer [source]\n");
        exit(64);
    }
    runFile(argv[1]);
    return 0;
}

void runFile(char* file)
{
    FILE *fp;
    // 修正变量名笔误
    if (!file)
    {
        printf("Error: invalid file path\n");
        return;
    }
    // 删掉多余的fopen调用,只调用一次
    fp = fopen(file, "r");
    if (fp == NULL)
    {
        printf("File not opened!\n");
        // 打开失败直接返回,不要执行后续fclose
        return;
    }
    printf("File opened Successfully!\n");
    // 只有打开成功的时候才关闭文件
    fclose(fp);
}
补充说明

你将逻辑移到main函数中没有触发问题,大概率是你迁移代码时修正了变量名笔误,或者打开失败后没有调用fclose操作,避开了空指针访问的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:09:02