c - C代码中令人惊讶的段错误

标签 c segmentation-fault factorial

我无法理解这段代码在运行时如何导致段错误,任何人都可以帮助我理解发生了什么吗??

#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/

相关文章:

c - 我没有关闭管道末端的一个,有什么不对劲吗?

c - 带有结构数组的函数段错误

c - 使用 STATIC INT 进行阶乘程序

c++ - 这是递归上下文中的编译器优化吗?

c - 在不使用 c 中的成员名称的情况下为结构成员赋值?

c++ - 在 Bison 中有一种方法可以返回 token 的名称而不是其类型

c - 将 MATLAB 中的指针参数传递给 C-DLL 函数 foo(char**)

c - 如何修复 C 中使用 struct dirent 时出现的段错误

c - 段错误(核心转储)Codelite ubuntu

java - 如何将水果堆放整齐