【发布时间】:2015-11-04 07:11:42
【问题描述】:
我写了一个程序来找到谐波数
(第n个调和数是前n个自然数的倒数之和)
的数字序列。我的程序将其输入作为命令行参数并以表格格式打印谐波数。 举个例子,它是这样工作的:
C:\Users\EDDiE\c>har 10 30 5
10 2.9289682539682538
15 3.3182289932289937
20 3.5977396571436819
25 3.8159581777535068
30 3.9949871309203906
10(argv [1]) = 起始编号,
30(argv[2]) = 结束数字,
5(argv[3]) = 前进一步。
在我的 windows 8 机器上,这个程序崩溃 在号码 43429
然后我在an online c compiler上执行它是一个linux环境(“我认为”,我不是linux用户)然后它工作正常。
这是我的程序:
har.c
#include <stdio.h>
#include <stdlib.h>
double harmonic(int);
int main(int argc, char *argv[])
{
int j;
int start = 1, end = 10, step = 1;
switch(argc) {
case 1:
break;
case 2:
end = atoi(argv[1]);
break;
case 3:
start = atoi(argv[1]);
end = atoi(argv[2]);
break;
case 4:
start = atoi(argv[1]);
end = atoi(argv[2]);
step = atoi(argv[3]);
break;
}
for (j = start; j <= end; j += step)
printf("%7d %3.20g\n", j, harmonic(j));
return 0;
}
double harmonic(int n)
{
//double H;
if (n == 1 || n == 0)
return 1.0;
else
return (1.0 / (double) n) + harmonic(n - 1);
//return H;
}
我需要知道为什么这个程序在 windows 环境下会崩溃。
我需要在代码(或我的系统)中修改什么吗?
【问题讨论】:
-
由于您使用的是递归,并且此问题与平台相关,并且仅在特定级别的递归中发生,这表明您遇到了经典的stack overflow。尝试增加堆栈大小。
-
Linux 中的默认进程堆栈大小为 8 MB,但在 Windows 上仅为 1 MB。如果你的递归运行得足够深,你可能会在 Windows 中遇到堆栈溢出,但在 Linux 上不会。
-
... 并且所示代码似乎将 printf() 所需的堆栈空间施加到每个递归级别。