数据类型导致的段错误?

3
我发现我的代码只适用于n <= 43429。如果n> 43429,则会导致分段错误。是数据类型或其他方面出错了吗?
这是我的代码和调试结果: 点击查看图片描述
#include<stdio.h>
#include<windows.h>

double recursive(long n);

int main(){
    printf("\nEnter n:");
    long n; scanf("%ld", &n);
    printf("\n%.2lf", recursive(n));
    getch();
    return 0;
}

double recursive(long n){
    if(n<=1) return 1;
    else return (double)1/n + recursive(n-1);
}

1
由于递归函数调用过多,您遇到了堆栈溢出错误。 - user13692250
1个回答

2
每次递归调用都需要在调用栈(通常称为“堆栈”)上占用空间。堆栈有一个固定的最大大小。如果使用完堆栈中的所有空间,程序会崩溃。您的操作系统和/或编译器默认使堆栈足够大,可以承受43429个递归调用,但不超过这个数。
通常有一种方法可以请求更多的堆栈空间,但不能从程序内部进行。在Windows上,您需要在“模块.def文件”中指定所需的大小。我不熟悉您正在使用的IDE,但应该在项目配置中转换为某个旋钮。
或者,现在是学习如何将递归转换为迭代的好时机。您的程序几乎是尾递归,因此这是一个简单的情况。
我不知道您如何设法让Windows使用“分段错误”这个短语报告此崩溃,但现在这并不重要。

非常感谢!我只是想检查一下数学题的解决方案,所以我快速编写了代码而不是使用for循环。然后它出现了一个我从未见过的错误。下次,我会考虑是否使用递归。 - Tung Hoang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接