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

C语言文件操作出现Thread 1: EXC_BAD_ACCESS错误,求排查

问题分析与修复

你遇到的EXC_BAD_ACCESS错误,直接原因是文件打开失败后未做检查,导致用NULL指针调用feof()。如果fopen("1zad.txt", "r")找不到目标文件,会返回NULL,此时访问这个空指针的内容就会触发内存访问错误。

除了这个致命问题,代码还有几个逻辑bug,一起给你修复:

主要问题点

  • 未检查文件是否成功打开:必须在使用文件指针前判断是否为NULL,否则会触发非法内存访问。
  • flag未循环重置:第一次遇到非回文字符串后,flag会一直保持0,后续的回文也不会被写入。
  • 错误使用feof控制循环:feof只有在读取到文件尾之后才会为真,容易导致多执行一次循环,引发异常。
  • 回文判断包含换行符:fgets会把换行符\n读入字符串,判断回文时会把它算进去,导致本该是回文的字符串被误判。

修复后的代码

#include <stdio.h>
#include <string.h>

int main()
{
    char line[255];
    unsigned long k;
    int i;

    // 打开文件后立即检查是否成功
    FILE *file = fopen("1zad.txt", "r");
    if (file == NULL) {
        printf("无法打开1zad.txt\n");
        return 1;
    }

    FILE *new_file = fopen("new1.txt", "a");
    if (new_file == NULL) {
        printf("无法打开new1.txt\n");
        fclose(file); // 已打开的文件要关闭
        return 1;
    }

    // 用fgets的返回值控制循环,这是读取文件行的标准写法
    while (fgets(line, 255, file) != NULL) {
        int flag = 1; // 每次处理新行时重置flag
        k = strlen(line);

        // 去掉换行符(如果存在),避免干扰回文判断
        if (k > 0 && line[k-1] == '\n') {
            line[k-1] = '\0';
            k--;
        }
        // 跳过空行
        if (k == 0) continue;

        for (i = 0; i < k/2; i++) {
            if (line[i] != line[k-1-i]) {
                flag = 0;
                break; // 发现不匹配直接跳出,减少不必要计算
            }
        }

        if (flag == 1) {
            fputs(line, new_file);
            fputs("\n", new_file); // 补回换行符保证格式正确
        }
    }

    fclose(file);
    fclose(new_file);
    return 0;
}

关键修复说明

  1. 文件打开校验:每次fopen后都判断指针是否为NULL,失败则提示并退出,避免非法内存访问。
  2. 循环逻辑优化:用fgets的返回值判断是否继续循环,彻底避免feof的坑。
  3. flag重置:把flag放到循环内部定义,确保每一行判断前都是初始状态。
  4. 换行符处理:移除fgets读入的换行符,判断完成后再补回,保证回文判断准确且输出格式正确。
  5. 提前终止循环:发现字符不匹配时直接break循环,提升效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 15:35:25