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

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结尾的行能匹配成功。如果要更严谨避免其他异常场景误判,可以改为提取行尾的数字后再做判断。

修复建议
  1. 路径存储改用栈数组或者主动分配堆内存:
// 示例:用栈数组存储路径
char path[1024];
snprintf(path, sizeof(path), "%s.names", argv[1]);
  1. 补全fp、fp1的变量定义,每次fopen后都要判断返回值是否为空,避免文件不存在导致的空指针访问。
  2. 读取最后一行改用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 08:06:03