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

C++编写的终端输入阶乘程序运行出现段错误是什么原因?

问题原因

  • 代码错误出在main函数对命令行参数的处理逻辑:argv是存储命令行参数的字符串指针数组,argv[1]指向的是传入参数字符串的首地址,而非参数对应的数值。直接对char*类型做(long)强制转换,实际是把字符串的内存地址强转成了数值,所以才会出现number取值为140732199978159这类异常大的结果。
  • 当你传入参数2时,number实际拿到的是"2"这个字符串的内存地址值,数值极大,调用递归的factorial函数时会产生上百万层递归,直接占满程序栈空间,触发栈溢出,也就是你遇到的段错误。

修复方案

需要先把字符串格式的参数转换为long类型的数值,C++中可以用stol函数完成转换,修复后的完整代码如下:

// factorial calculator
#include <iostream>
#include <string> 
using namespace std;

long factorial(long a) {
    if (a > 1)
        return (a * factorial(a-1));
    else
        return 1;
}

int main(int argc, char *argv[]) {
    // 先判断是否传入了参数,避免无参数运行时访问argv[1]越界
    if (argc < 2) {
        cout << "请传入要计算的数值参数,用法:./factorial [数值]" << endl;
        return 1;
    }
    long number = stol(argv[1]); 
    cout << number << "! = " << factorial(number) << '\n';
    return 0;
}
  • 额外建议:可以补充参数合法性校验逻辑,比如判断输入的数值是否为非负整数,避免负数或者非数字输入导致的异常。

内容的提问来源于stack exchange,提问作者Ethan Ladwig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 22:51:00