此代码在 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 leaks和 buffer overflows 。使用valgrind如果你的系统有的话。另请阅读维基页面 garbage collection 。当您更加流利地使用 C 编程时,有时您可能会对使用 Boehm conservative garbage collector for C 感兴趣。 .
关于c - 我的代码不适用于较大的 n 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29066316/