我最近开始学习C语言。我使用Code :: Blocks with MinGW和Cygwin GCC。
我为Project Euler问题10做了一个非常简单的主筛,它将低于特定限制的素数打印到stdout。它工作正常,直到大约500000作为限制,但高于我的minGW编译.exe崩溃和GCC编译的一个抛出“STATUS_STACK_OVERFLOW”异常。
我很困惑为什么,因为代码是完全非递归的,由简单的for循环组成。
#include <stdio.h>
#include <math.h>
#define LIMIT 550000
int main()
{
int sieve[LIMIT+1] = {0};
int i, n;
for (i = 2; i <= (int)floor(sqrt(LIMIT)); i++){
if (!sieve[i]){
printf("%d\n", i);
for (n = 2; n <= LIMIT/i; n++){
sieve[n*i] = 1;
}
}
}
for (i; i <= LIMIT; i++){
if (!sieve[i]){
printf("%d\n", i);
}
}
return 0;
}
答案 0 :(得分:4)
看起来你不能在堆栈上分配550000个int,而是动态分配它们。
int * sieve;
sieve = malloc(sizeof(int) * (LIMIT+1));
答案 1 :(得分:3)
当您的内存块大于堆栈时,您的基本选项是将变量存储在data segment中:
malloc
为堆中的数组分配内存(如@Binyamin所解释)static int sieve[SIZE_MACRO]
答案 2 :(得分:1)
该程序中的所有内存都分配在堆栈中。增加数组大小时,会增加堆栈所需的空间量。最终无法调用该方法,因为堆栈上没有足够的空间来容纳它。
使用malloc
数组进行体验(因此它在堆上分配)。或者学习如何告诉编译器分配更大的堆栈。