我的代码不会针对n的大值运行

时间:2015-03-15 21:21:00

标签: c variables integer type-conversion

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

#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();
}

1 个答案:

答案 0 :(得分: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上的wikipage。如果您对C编程更加流利,您可能有兴趣使用Boehm conservative garbage collector for C