C程序处理stem文件执行时报Segmentation fault (core dumped)错误查询
段错误原因分析
- 野指针写入(最核心原因)
你定义的char* path;、char* path1;均为未初始化的野指针,没有指向合法的可写内存空间,直接调用sprintf往指针指向的未知地址写入拼接后的文件名,直接触发内存访问越界,导致段错误。
你最初尝试修改的代码也存在同类问题:char *path = argc > 1 ? argv[1] : "stdin";这里argv[1]属于程序入参的只读存储区,字符串常量"stdin"也在只读内存段,直接调用sprintf往只读地址写入后缀,同样会触发段错误。 - 变量未定义
代码中注释掉了FILE *fp =stdin;、FILE *fp1 = stdin;的定义语句,后续直接对fp、fp1赋值,属于未定义行为,也可能触发段错误。 - 其他逻辑隐患
你使用while(!feof(fp))的循环逻辑存在问题:feof标记是在读取操作失败后才会被置位,循环的最后一次fscanf会读取失败,buff可能为空,虽然不会直接导致段错误,但会影响后续判断逻辑。
strchr判断是否满足需求 你给出的.names文件最后一行只有三种固定格式的场景下,strchr(buff, '0')可以满足需求:1和2结尾的行不会出现字符'0',只有0结尾的行能匹配成功。如果要更严谨避免其他异常场景误判,可以改为提取行尾的数字后再做判断。
修复建议
- 路径存储改用栈数组或者主动分配堆内存:
// 示例:用栈数组存储路径 char path[1024]; snprintf(path, sizeof(path), "%s.names", argv[1]);
- 补全
fp、fp1的变量定义,每次fopen后都要判断返回值是否为空,避免文件不存在导致的空指针访问。 - 读取最后一行改用
fgets实现,示例逻辑:
char buff[1024] = {0}; char last_line[1024] = {0}; while (fgets(buff, sizeof(buff), fp) != NULL) { strncpy(last_line, buff, sizeof(last_line) - 1); } // 后续直接判断last_line即可
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

