0

可能重复:
堆栈溢出 C++

我有以下用于生成素数的程序:

#include<iostream> 
#include<cmath>
#include<algorithm>

#define MAX 10000000
using namespace std;

int main(int argc, const char *argv[])
{
    bool prime[MAX+1];
    fill_n(prime,MAX+1,true);
    int baseSqrt,i,j;
    baseSqrt = int(sqrt(MAX+1));
    for(i=2;i<=baseSqrt;i++){
        if(prime[i]){
            for(j=i+i;j<=MAX;j+=i){
                    prime[j]=false;
            }   
        }   
    }   
    return 0;
}

该程序适用于 MAX 值 = 1000000。但是当我将值增加到 10000000 时,程序会给出段错误。我尝试使用 gdb,但它停止在 main 那里给出段错误。我使用的是 64 位操作系统。即使我删除 MAX 并写 10000000 而不是 MAX,我也会得到同样的错误。我哪里错了?请帮忙。

4

2 回答 2

5

您不应该将非常大的数组声明为局部变量(即在堆栈上),因为堆栈大小通常非常有限。new[]相反,使用和动态分配它们delete[]。或者对于惯用的 C++,使用容器类,如std::deque.

于 2013-01-06T12:41:01.833 回答
0

在这种特殊情况下,将“prime”设为全局变量不是一个合理的想法。我确实理解全局变量并不总是一个好的解决方案,但对于这种特殊情况,这将是一个相当明显的解决方案。这不像 MAX 不是一个常数,所以使用 new/delete 或 vector 作为解决方案似乎有点不必要。

并回答“如果使用'new' vs global variable'是否更慢'的问题,那么我可以说这可能是无关紧要的。我#define MAX 1000000000在上面的代码中使用,将prime移动为全局,并使用时间运行它,然后将代码更改为使用 new/delete,并且花费了大约 0.5 秒的时间——但总体运行时间是 20.4 或 20.9 秒,所以它大约是总运行时间的 2%,我很确定可以获得超过 2%通过做其他事情。

于 2013-01-06T14:01:35.697 回答