我无法理解这段代码在运行时如何导致段错误,任何人都可以帮助我理解发生了什么吗??
#include <stdio.h>
unsigned long long factorial(unsigned long long x, unsigned long long amt)
{
if (x == 1ULL) return amt;
else return factorial(x-1ULL, amt*x);
}
int main(int argc, char *argv[])
{
for (unsigned long long i = 0; i < 10ULL ;i++) {
printf("%llu\n", factorial(i, 1ULL));
}
}
最佳答案
首先,段错误不一定是由无效指针取消引用引起的。在这种情况下,实际上是无限递归最终耗尽栈空间造成的。为什么?递归函数的基本要求是它必须在某个状态下完成和终止递归,如果你仔细查看你的代码,在函数 factorial
中,如果 x
为 0,那么递归将变得无休止并最终使您的程序崩溃。您可以通过将终止条件更改为以下方式来解决此问题:
if (x <= 1ULL) return amt;
关于c - C代码中令人惊讶的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37200309/