C 递归阶乘实现的分段错误
现在我正在Linux上练习使用Vim。 我编写了这样一个简单的代码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
#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这是一个-然而,它可能会帮助未来的读者,所以它可以被考虑的主题。