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
相关产品推荐
相关产品推荐

