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

使用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,要么是遗漏了变量定义,要么是写代码时填错了变量名,也会引发未定义行为。

修复方案

  1. 先在参数解析前添加参数数量校验,判断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);
    
    // 剩余业务逻辑
}
  1. 如果你是通过IDE直接运行程序,到IDE的运行配置栏找到「命令行参数」「启动参数」选项,按顺序填入8个业务参数后再启动即可。

内容的提问来源于stack exchange,提问作者Pallavi Prakash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:06:03