此代码运行的数值为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();
}
答案 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 leaks和buffer overflows。如果您的系统有,请使用valgrind。另请阅读garbage collection上的wikipage。如果您对C编程更加流利,您可能有兴趣使用Boehm conservative garbage collector for C。