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; }
关键修复说明
- 文件打开校验:每次
fopen后都判断指针是否为NULL,失败则提示并退出,避免非法内存访问。 - 循环逻辑优化:用
fgets的返回值判断是否继续循环,彻底避免feof的坑。 flag重置:把flag放到循环内部定义,确保每一行判断前都是初始状态。- 换行符处理:移除
fgets读入的换行符,判断完成后再补回,保证回文判断准确且输出格式正确。 - 提前终止循环:发现字符不匹配时直接
break循环,提升效率。
内容的提问来源于stack exchange,提问作者a11ex
相关产品推荐
相关产品推荐

