C中的“状态堆栈溢出”,具有简单的迭代

时间:2012-03-06 17:30:36

标签: c stack-overflow

我最近开始学习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;
}

3 个答案:

答案 0 :(得分:4)

看起来你不能在堆栈上分配550000个int,而是动态分配它们。

int * sieve;
sieve = malloc(sizeof(int) * (LIMIT+1));

答案 1 :(得分:3)

当您的内存块大于堆栈时,您的基本选项是将变量存储在data segment中:

  • 使用malloc为堆中的数组分配内存(如@Binyamin所解释)
  • 通过将数组声明为static int sieve[SIZE_MACRO]
  • 将数组存储在Data / BSS段中

答案 2 :(得分:1)

该程序中的所有内存都分配在堆栈中。增加数组大小时,会增加堆栈所需的空间量。最终无法调用该方法,因为堆栈上没有足够的空间来容纳它。

使用malloc数组进行体验(因此它在堆上分配)。或者学习如何告诉编译器分配更大的堆栈。