c - 我的代码不适用于较大的 n 值

标签 c variables integer type-conversion

此代码在 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();
}

最佳答案

是的,您不能声明一个非常大的本地数组,因为它位于 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 感兴趣。 .

关于c - 我的代码不适用于较大的 n 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29066316/

相关文章:

Java Unicode 变量名

types - Lua 如何从 1.0 中分辨 1

python - 我怎样才能把 000000000001 变成 1?

c++ - 从文件读取字节为短/长整数

c - 程序有时会出现段错误,但并非总是如此。我该如何纠正它?

c - 使用函数处理链表的程序可以运行,但产生的结果为 1

c++ - 在 C/C++ 中实现 UNUSED 宏的通用编译器独立方式

c - 警告 : implicit declaration of function ‘printf’

c - While循环变量初始化和变量类型(C)

javascript - 我的范围有什么问题?为什么我不覆盖变量? js