2011-12-27 14 views
0

シーブを使用していくつかの素数を出力する次のコードは、オンラインジャッジでSIGSEGVエラーを生成します。C++ループで非常に大きな配列を持つSIGSEGV

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++; 
    } 
} 

は、上記のように第二のループを変更します。エラーは表示されません。これがなぜ発生するのか、このintを最初のプログラムで修正する方法についての助けになるかもしれません。

+4

は、デバッガでこれを実行することがありますか?これにより、seg-faultの原因となった行が表示されます。 –

+4

'int arr [100000000];'がスタック上に作成されています。これは、配列を動的に割り当てることを検討すべき巨大なサイズです。単に 'std :: vector'を使うだけです。 –

答えて

6

これは、巨大な自動配列を宣言することによって、ほぼ確実にスタックのオーバーフローが発生します。自動変数は通常、スタックに配置されます。通常、スタックの最大サイズは数メガバイトです。

通常は、ヒープ上に割り当てられた動的配列を使用することによってそれを修正することができます:

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

問題を解決していただきありがとうございます。 :) – user533550

関連する問題