对于较大的 n 值,我的代码不 运行
My code does not run for large values of n
此代码运行 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. Be scared of memory leaks and buffer overflows. Use valgrind if your system has it. Read also the wikipage on garbage collection. When you'll be more fluent with C programming, you might be interested in sometimes using Boehm conservative garbage collector for C。
此代码运行 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. Be scared of memory leaks and buffer overflows. Use valgrind if your system has it. Read also the wikipage on garbage collection. When you'll be more fluent with C programming, you might be interested in sometimes using Boehm conservative garbage collector for C。