为什么这个C程序在Windows上崩溃并且在linux上工作正常?

时间:2015-11-04 07:11:43

标签: c linux windows crash

我写了一个程序来查找谐波数

  

(第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环境下崩溃了。

我需要在代码中(或在我的系统中)修改任何内容吗?

1 个答案:

答案 0 :(得分:3)

正如评论中已经说明的那样,您最有可能遇到堆栈溢出。尽管如此,您的递归可以轻松转换为迭代,如下所示:

n

这样,您的程序将适用于大double harmonic(int n) { if(n == 0) return 1.0; double res = 0.0; while(n > 0) { res += (1.0 / (double) n); --n; } return res; }