C 递归阶乘实现的分段错误

C 递归阶乘实现的分段错误,c,C,现在我正在Linux上练习使用Vim。 我编写了这样一个简单的代码 #include <stdio.h> int factorial(int n){ if (n<0) { return 0; } else if (n==0) { return 1; } else { return n * factorial(n); } } int main(void){ int n = 0; printf("Put n value : "); scan

现在我正在Linux上练习使用Vim。 我编写了这样一个简单的代码

#include <stdio.h>

int factorial(int n){
   if (n<0) { return 0; }
   else if (n==0) { return 1; }
   else { return n * factorial(n); }
}

int main(void){
   int n = 0;

   printf("Put n value : ");
   scanf("%d", &n);  /* non-OP inserted ";" to help people focus on the problem */

   printf("%d! = %d\n", n, factorial(n));

   return 0;
}
当我输入-1和0时,它就工作了。它们返回0和1。 然而,当我把正整数值放在n上时,它不起作用。 我试图找出原因,所以我用了gdb, 但它只是这样说的:

程序接收信号SIGSEGV,分段故障。 阶乘中的0x00000000000400620

我的代码怎么了?我甚至不能理解这一点。

当n>0时,你的递归程序永远不会终止。n的值永远不会递减,因此它将继续递归运行,直到内存耗尽


返回n*factorialn-1

您的代码导致堆栈溢出。在给定的函数中,n永远不会递减。最后一句话应该是

else { return n * factorial(n-1); }

这种情况不会发生在vim或编译器中,而是发生在您自己的错误代码中。您可以使用不同的like或不同的编译器like…,但仍然会得到相同的错误。因此,vim标记或对它的提及是不相关的,因为输入错误或不可复制的关闭投票是需要解释的…没有描述的关闭投票没有mcve是需要解释的…下次,用所有警告和调试信息编译代码:gcc-Wall-Wextra-g,并改进代码以获得无警告。这样你就可以更容易地做到。顺便说一句,您的“修复我的代码”问题是离题的,您的用户没有任何初步的解释part@Yunnosch这是一个-然而,它可能会帮助未来的读者,所以它可以被考虑的主题。