C程序传递-f文件名参数时出现zsh: bus error错误如何解决
问题根因
你遇到的总线错误和参数传递方式无关,是代码本身存在非法内存写入问题,核心错误点在fname变量的初始化逻辑:
fname = (char *)malloc(200*sizeof(char)); fname = "abr.res";
- 第一行申请了200字节的可写堆内存,将内存地址赋值给fname
- 第二行直接将fname重新指向了只读数据段的字符串常量
"abr.res",不仅造成malloc的内存泄漏,后续处理-f参数时执行strcpy(fname, optarg)相当于往只读内存写入数据,直接触发总线错误。
修复方案
修改fname的初始化逻辑即可,推荐两种修改方式:
方案1:保留malloc逻辑,正确初始化默认值
将原有两句初始化代码替换为:
fname = (char *)malloc(200*sizeof(char)); if (fname == NULL) { perror("malloc"); exit(1); } strcpy(fname, "abr.res");
方案2:改用栈数组简化逻辑,避免内存泄漏风险
将变量定义处的char *fname;修改为:
char fname[200] = "abr.res";
同时删除原有两句malloc和赋值的初始化代码即可。
传参说明
修复代码后,你原本使用的./abr1 -f "result01.res"命令完全符合参数要求,可以正常运行。
内容的提问来源于stack exchange,提问作者user1993416
相关产品推荐
相关产品推荐

