可能重复:
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,我也会得到相同的错误。我哪里错了?请帮忙。
答案 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%。