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
相关产品推荐
相关产品推荐

