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

C语言封装文件打开函数后出现Segmentation fault问题求助

C语言封装文件打开函数后触发段错误的原因分析

问题场景

将原本正常运行的文件打开逻辑封装到open_file函数后,程序触发Segmentation fault:

  • 调用函数后判断file == NULL的逻辑失效,无法正确检测文件打开失败
  • 后续执行带转义序列的printf或文件操作时触发段错误

原主代码:

char file_name[20];
FILE *file;

...

printf("File name > ");
scanf("%s", file_name);

file = fopen(file_name, "r");
if(file == NULL)
{
    printf("¡Error loading file!\n");
    return 1;
}

printf("\nRows > ");

...

封装后的函数:

void open_file(FILE *file)
{
    char file_name[20];

    printf("File name > ");
    scanf("%s", file_name);

    file = fopen(file_name, "r");
}

调用后的主代码:

char file_name[20];
FILE *file;

...

open_file(file);
if(file == NULL)
{
    printf("¡Error opening the file!\n");
    return 1;
}

printf("\nRows > ");

...

核心原因

C语言采用值传递机制:

  • 封装的open_file函数中,形参file是主函数里file指针的副本
  • 函数内部执行file = fopen(...)时,只是修改了这个副本的指向,主函数中的原file指针完全不受影响,仍然是未初始化的野指针(垃圾值)

这就导致:

  1. 主函数中判断file == NULL完全失效——野指针既不是NULL也不是有效的文件句柄
  2. 后续如果用这个野指针操作文件,或者因野指针导致内存访问异常,直接触发Segmentation fault

修复方案

有两种常见的正确封装方式:

方式1:使用双重指针传递

通过指针的指针,让函数能直接修改主函数中指针的指向:

void open_file(FILE **file)
{
    char file_name[20];

    printf("File name > ");
    scanf("%s", file_name);

    *file = fopen(file_name, "r");
}

调用时传入指针的地址:

open_file(&file);

方式2:让函数返回文件指针

直接让函数返回fopen的结果,赋值给主函数的指针变量:

FILE* open_file(void)
{
    char file_name[20];

    printf("File name > ");
    scanf("%s", file_name);

    return fopen(file_name, "r");
}

调用方式:

file = open_file();

两种方式都能确保主函数中的file指针正确获取fopen的返回值,后续的NULL判断和文件操作就能正常工作。

内容的提问来源于stack exchange,提问作者Johnny Brent Astudillo Soriano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:45:54