C程序中由文件指针引发的段错误问题排查
C语言段错误问题分析与解决方法
错误成因
- 未检查文件打开结果:当
fopen无法找到目标文件ManyRandomNumbersLog.txt,或是没有读取权限时,会返回NULL指针。直接用这个无效的NULL指针调用feof、fgets函数,会触发非法内存访问,导致段错误。 - 错误使用
feof作为循环终止条件:feof的特性是只有在尝试读取超出文件末尾后才会标记文件结束状态,无法提前预判是否到了文件末尾。这会导致最后一次循环时,fgets读取失败但仍执行printf,可能引发额外问题。
解决方法
- 添加文件指针有效性检查:调用
fopen后立即判断指针是否为NULL,若打开失败则输出错误信息并终止程序。 - 用
fgets的返回值控制循环:fgets成功读取内容时返回缓冲区地址,到达文件末尾或读取失败时返回NULL,以此作为循环终止条件更准确。 - 程序结束前关闭文件:避免文件资源泄漏,养成良好的资源管理习惯。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <ctype.h> int main() { FILE *filePtr; char fileStr[150]; // Buffer for reading file. filePtr = fopen("ManyRandomNumbersLog.txt", "r"); // 检查文件是否成功打开 if (filePtr == NULL) { perror("Failed to open file"); return EXIT_FAILURE; } printf("\n\nNow reading the file:\n"); // 用fgets的返回值作为循环条件 while (fgets(fileStr, 150, filePtr) != NULL) { printf("%s", fileStr); } // 关闭文件,避免资源泄漏 fclose(filePtr); return 0; }
内容的提问来源于stack exchange,提问作者Matteo Gala
相关产品推荐
相关产品推荐

