Tamis d'Eratosthène

J'ai lu sur le tamis d'Eratosthène tout en résolvant une question sur le Projet Euler . Je suis sûr que vous savez de quelle question je parle. Alors voici la chose. Mon code parvient à afficher correctement tous les nombres premiers inférieurs à 1 million. Cependant, lorsque j'essaie la même implémentation pour 2 millions de dollars, cela me donne une erreur de segmentation ... J'ai une certaine idée de la cause de l'erreur mais je ne sais pas comment la corriger ... Voici le code pour les nombres premiers inférieurs à 1 million.

#include
int main(void)
{
   int i,k=2;
   int j;
   int n=1000000;
   int prime[2000000]={};
   for(i=0;in)
                  break;    
            }
         }
      }
   }
   for(i=0;i
3
Cela ressemble à un accès au tableau éventuellement hors limites: prime [j * prime [i]] = 0 .
ajouté l'auteur Jon, source
Avez-vous pour votre intention de changer int n = 1000000; en int n = 2000000;
ajouté l'auteur Dave, source
S'il doit indexer un grand tableau, il peut aussi utiliser size_t
ajouté l'auteur Dave, source
Par ailleurs, vous devriez probablement utiliser un autre type de données que int . Int n'est pas garanti d'être d'une taille particulière, autre que 16 bits. En tant que problème de style, je recommanderais long pour les nombres supérieurs à 32k.
ajouté l'auteur logancautrell, source

1 Réponses

Vous allouez un énorme tableau en pile:

int prime[2000000]={};

Quatre octets fois deux millions équivalent à huit mégaoctets, ce qui correspond souvent à la taille maximale de la pile. Allouer plus que cela entraîne une erreur de segmentation.

Vous devriez allouer le tableau en tas, à la place:

int *prime;
prime = malloc(2000000 * sizeof(int));
if(!prime) {
    /* not enough memory */
}
/* ... use prime ... */
free(prime);
9
ajouté
4 * 2 * 10 ^ 6 = 7,6 * 2 ^ 20 = 7,6 Mo
ajouté l'auteur Dave, source
Merci! ... ça marche maintenant
ajouté l'auteur Ole Gooner, source