2013-01-06 54 views
0

可能重複:
stack overflow c++最大數組大小語言中使用#define

我已經生成素數下面的程序:

#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

與您可以使用的內存總量相比,堆棧的大小通常非常有限 – chris

回答

4

您不應該將非常大的數組聲明爲局部變量(即在堆棧上),因爲堆棧大小通常非常有限。相反,動態分配new[]delete[]。或者對於慣用的C++,使用容器類如std::deque

+0

我可以使用的最大大小是多少?大約是1MB嗎?因爲#define MAX 7000000程序正常工作 –

+1

爲什麼'new []'和'delete []'?爲什麼不'std :: vector'? – Nawaz

+0

@Nawaz:爲什麼'std :: vector'?爲什麼不'std :: deque'? – IInspectable

0

在這種特殊情況下,將「prime」作爲全局變量是否合理?我明白,全局變量並不總是一個好的解決方案,但對於這種特殊情況,這將是一個相當明顯的解決方案。這不像MAX不是一個常量,所以使用new/delete或vector作爲解決方案似乎有點不必要。

回答「如果使用較慢'新'vs全局變量'',那麼我可以說這可能是不相關的。我在上面的代碼中使用了#define MAX 1000000000,移動素數成爲全局,並跑它使用時間,然後修改代碼以使用new/delete,並且花費了大約0.5秒的時間 - 但總體運行時間是20.4或20.9秒,因此它大約是總運行時間的2%,而且我非常確定2%可以通過做其他事情獲得