使用sscanf读取命令行参数时出现Thread 1: EXC_BAD_ACCESS (code=1, address=0x0)错误
错误根因分析
- 最直接的触发原因是运行程序时没有传入足够的命令行参数:代码中直接读取
argv[1]到argv[8]共8个参数,C/C++中如果运行时未传入对应数量的参数,argv对应下标位置的指针就是空指针(地址为0x0),sscanf尝试读取空指针指向的内存时就会抛出你遇到的EXC_BAD_ACCESS (code=1, address=0x0)错误。你提到程序此前可正常运行,基本是因为之前运行时带全了启动参数,本次运行是直接点击执行、或者启动配置里漏填了参数导致的。 - 额外的代码隐患:你给出的代码片段中,
risk_free_rate、strike_price、barrier_price三个变量没有提前声明,仅定义了同名用途的全局变量R,要么是遗漏了变量定义,要么是写代码时填错了变量名,也会引发未定义行为。
修复方案
- 先在参数解析前添加参数数量校验,判断
argc是否等于9(程序本身占argv[0],加8个业务参数总共9个),数量不匹配直接输出提示后退出,从根源上避免空指针访问:
#include <iostream> #include <iomanip> #include <cmath> #include <fstream> #include <cstdlib> #include <random> #include <chrono> #include "normdist.h" using namespace std; double initial_stock_price, expiration_time, volatility, R; int no_of_discrete_barriers, no_of_trials; int main(int argc, char* argv[]) { // 新增参数校验逻辑 if (argc != 9) { cout << "参数数量错误,正确用法:" << argv[0] << " 到期时间 无风险利率 波动率 初始股价 行权价 模拟次数 离散障碍数 障碍价" << endl; return -1; } // 补全缺失的变量声明,或者把对应变量替换成你已经定义的R double risk_free_rate, strike_price, barrier_price; sscanf(argv[1], "%lf", &expiration_time); sscanf(argv[2], "%lf", &risk_free_rate); sscanf(argv[3], "%lf", &volatility); sscanf(argv[4], "%lf", &initial_stock_price); sscanf(argv[5], "%lf", &strike_price); sscanf(argv[6], "%d", &no_of_trials); sscanf(argv[7], "%d", &no_of_discrete_barriers); sscanf(argv[8], "%lf", &barrier_price); // 剩余业务逻辑 }
- 如果你是通过IDE直接运行程序,到IDE的运行配置栏找到「命令行参数」「启动参数」选项,按顺序填入8个业务参数后再启动即可。
内容的提问来源于stack exchange,提问作者Pallavi Prakash
相关产品推荐
相关产品推荐

