2011-12-27 43 views
0

以下代碼使用篩選打印一些素數會在在線判斷中生成SIGSEGV錯誤。SIGSEGV在C++循環中有一個非常大的數組

int main() 
{ 
long count=1; 
int arr[100000000]; 
printf("2\n"); 
for(long i=3;i<100000000;i=i+2) 
{ 
    arr[i]=1; 
} 
for(long i=3;i<100000000;i=i+2) 
{ 
    if(arr[i]==1) 
    { 
     count++; 
     if(count%100==1)printf("%ld\n",i); 
     for(long j=2;i*j<100000000;j++) 
      arr[i*j]=0; 
    } 
} 
//scanf("%ld",&count); 
} 

,但如果我刪除了一些語句:

for(long i=3;i<100000000;i=i+2) 
{ 
    if(arr[i]==1) 
    { 
     count++; 
    } 
} 

修改如上第二循環。它不顯示錯誤。可以幫助解釋爲什麼會發生這種情況,以及如何在第一個程序中糾正這種情況。

+4

您是否在調試器中運行以下命令:

您可以通過使用動態數組,通常在堆中分配解決?這會告訴你什麼線路導致了seg-fault。 – 2011-12-27 17:37:12

+4

'int arr [100000000];'在棧上創建,這是一個巨大的尺寸,你應該考慮動態分配數組,或者更好的簡單的使用'std :: vector'。 – 2011-12-27 17:41:27

回答

6

這幾乎可以肯定是一個堆棧溢出,由聲明一個巨大的自動數組引起。自動變量通常放在堆棧上,堆棧的最大大小通常爲幾兆字節。

std::vector<int> arr(100000000); 
+0

謝謝,這確實解決了問題。 :) – user533550 2011-12-28 04:33:08