5

Project Eulerに関する質問を解きながら、Eratosthenes のふるいを読みました。私はあなたが私が話している質問を知っていると確信しています。これが問題です。私のコードは、100 万未満のすべての素数を正しく表示することができます。しかし、200 万に対して同じ実装を試みると、セグメンテーション違反が発生します...エラーが発生する理由については一定の考えがありますが、それを修正する方法がわかりません... 100 万未満の素数のコードは次のとおりです。 .

#include<stdio.h>
int main(void)
{
   int i,k=2;
   int j;
   int n=1000000;
   int prime[2000000]={};
   for(i=0;i<n;i++) // initializes the prime number array
   {
      prime[i]=i;
   }
   for(i=2;i<n;i++) // Implementation of the Sieve
   {
      if(prime[i]!=0)
      { 
         for(j=2;j<n;j++)
         {
            {
               prime[j*prime[i]]=0;
               if(prime[i]*j>n)
                  break;    
            }
         }
      }
   }
   for(i=0;i<n;i++) // Prints the prime numbers
      if(prime[i]!=0)
      {
         printf("%d\n"prime[i]);
      }
      return(0);
   }
}
4

4 に答える 4

13

スタックに巨大な配列を割り当てています:

int prime[2000000]={};

4 バイト x 200 万は 8 メガバイトに等しく、多くの場合、これが最大スタック サイズです。それ以上を割り当てると、セグメンテーション違反が発生します。

代わりに、配列をヒープに割り当てる必要があります。

int *prime;
prime = malloc(2000000 * sizeof(int));
if(!prime) {
    /* not enough memory */
}
/* ... use prime ... */
free(prime);
于 2011-10-27T19:54:46.247 に答える