【问题标题】:Why is this C program crashes on windows and works fine on linux?为什么这个 C 程序在 windows 上崩溃而在 linux 上运行良好?
【发布时间】: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() 所需的堆栈空间施加到每个递归级别。

标签: c linux windows crash


【解决方案1】:

正如 cmets 中所述,您很可能遇到了堆栈溢出。不过有希望,您的递归可以很容易地转换为迭代,如下所示:

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;
}

这样您的程序将适用于大n

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2014-02-21
    相关资源
    最近更新 更多