使用#define的最大数组大小

时间:2013-01-06 12:39:18

标签: c++ arrays segmentation-fault c-preprocessor

  

可能重复:
  stack overflow 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,但它停止在主要给那里segfault。我使用的是64位操作系统。即使我删除MAX并写入10000000而不是MAX,我也会得到相同的错误。我哪里错了?请帮忙。

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

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

要回答“如果使用'新'对全局变量'的速度慢的问题,那么我可以说它可能是无关紧要的。我在上面的代码中使用#define MAX 1000000000,移动素数为全局,并使用时间运行它,然后将代码更改为使用new / delete,并且花了大约0.5秒 - 但整体运行时间为20.4或20.9秒,因此它大约占总运行时间的2%,而且我很漂亮做其他事情肯定可以获得超过2%。

相关问题