【问题标题】:My code does not run for large values of n我的代码不适用于较大的 n 值
【发布时间】:2015-03-15 21:21:00
【问题描述】:

此代码运行 n 的值约为 100k,但当它达到一百万时它停止并崩溃。

#include <stdio.h>
int main()
{
    int i;
    long int n, sum;
    n = 1000000;
    int f[];
    f[0] = 1;
    f[1] = 2;
    sum = 0;
    for (i = 2; f[i-1] < n; i++)
    {
        f[i] = f[i-1] + f[i-2];
        printf("%ld \n", f[i]);
        if(f[i] % 2 == 0)
        {
            sum = sum + f[i]; 
        }
    }
    printf("%d \n", sum);
    getchar();
}

【问题讨论】:

  • int f[]; ?那不应该编译。
  • 在标准模式下调用你的编译器。您需要为 f 选择一个大小,例如int f[5000]; 并且您还应该在循环中添加一个检查,以便在 i 达到 5000 时优雅地退出。如果您不优雅地退出,那么您可能会遇到“停止和崩溃”或其他奇怪的行为。
  • 格式化!…aaargh…
  • 对不起!自从我用 C/C++ 编写任何代码以来已经有好几年了。当你说代码缺乏格式时,你能告诉我社区到底在寻找什么吗?

标签: c variables integer type-conversion


【解决方案1】:

是的,您不能声明一个非常大的本地数组,因为它位于 call stack 中。

我确定您的局部变量 int f[]; 是一个错字(不会编译)。您可能的意思是(在设置了n 之后)类似于int f[n];,所以您使用的是VLA

调用堆栈的大小有限(在当前运行 Linux 的桌面上通常为几兆字节)。

你应该在堆中分配你的大数组(所以使用指针):

 unsigned n = 1000000;
 int *f = malloc(n*sizeof(int));
 if (!f) { perror("malloc"); exit(EXIT_FAILURE); };

那么你最好清除它(因为堆​​malloc-分配的内存区域包含垃圾值):

 memset(f, 0, n*sizeof(int));

那么你就可以像以前一样使用它了。

在你的程序结束时(在你的情况下接近main的结尾)一定要打电话给free(p);;实际上,一旦确定永远不会使用它,就应该释放堆分配的内存区域。但要小心(即小心)pointer aliasing

了解C dynamic memory allocation。害怕memory leaksbuffer overflows。如果您的系统有valgrind,请使用它。另请阅读garbage collection 上的维基页面。当您对 C 编程更加流利时,您可能会对有时使用 Boehm conservative garbage collector for C 感兴趣。

【讨论】:

  • 原码没有int f[1000000];,也没有打算。 n 不是数组维度。
  • f[] 我把它放在这里时是一个错字……我现在明白了。谢谢!尽管我已经编写了很多 MATLAB 代码,但我还没有在 C 上做过很多编码。我猜对于习惯了 MATLAB 的用户友好性的人来说,C 语言更难。感谢您为我解决这个问题。
猜你喜欢
  • 2021-09-17
  • 2017-12-02
  • 1970-01-01
  • 2015-12-10
  • 2016-01-01
  • 2020-01-09
  • 2020-11-13
  • 2022-01-11
  • 2014-05-25
相关资源
最近更新 更多