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

C程序中由文件指针引发的段错误问题排查

C语言段错误问题分析与解决方法

错误成因

  • 未检查文件打开结果:当fopen无法找到目标文件ManyRandomNumbersLog.txt,或是没有读取权限时,会返回NULL指针。直接用这个无效的NULL指针调用feof、fgets函数,会触发非法内存访问,导致段错误。
  • 错误使用feof作为循环终止条件:feof的特性是只有在尝试读取超出文件末尾后才会标记文件结束状态,无法提前预判是否到了文件末尾。这会导致最后一次循环时,fgets读取失败但仍执行printf,可能引发额外问题。

解决方法

  1. 添加文件指针有效性检查:调用fopen后立即判断指针是否为NULL,若打开失败则输出错误信息并终止程序。
  2. 用fgets的返回值控制循环:fgets成功读取内容时返回缓冲区地址,到达文件末尾或读取失败时返回NULL,以此作为循环终止条件更准确。
  3. 程序结束前关闭文件:避免文件资源泄漏,养成良好的资源管理习惯。

修正后的代码

#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:42:08