web-dev-qa-db-fra.com

Erreur de segmentation sur de grandes tailles de tableau

Le code suivant m'indique une erreur de segmentation lorsqu'il est exécuté sur une machine de 2 Go, mais fonctionne sur une machine de 4 Go.

int main()
{
   int c[1000000];
   cout << "done\n";
   return 0;
}

La taille du tableau est juste 4Mb. Existe-t-il une limite à la taille d'un tableau pouvant être utilisé en c ++?

100
Mayank

Vous ne faites probablement que déborder de la pile ici. Le tableau est trop volumineux pour tenir dans l'espace d'adressage de la pile de votre programme.

Si vous allouez le tableau sur le tas, tout va bien, en supposant que votre ordinateur dispose de suffisamment de mémoire.

int* array = new int[1000000];

Mais souvenez-vous que cela vous obligera à delete[] le tableau. Une meilleure solution serait d'utiliser std::vector<int> et redimensionnez à 1000000 éléments.

113
Charles Salvia

En C ou C++, les objets locaux sont généralement alloués sur la pile. Vous allouez un grand tableau sur la pile, plus que ce que la pile peut gérer, vous obtenez donc un stackoverflow.

Ne l'allouez pas localement sur la pile, utilisez plutôt un autre endroit. Cela peut être réalisé soit en rendant l'objet global, soit en l'attribuant sur le global heap. Les variables globales conviennent, si vous n'utilisez aucune des unités de compilation. Pour éviter que cela ne se produise par accident, ajoutez un spécificateur de stockage statique, sinon, utilisez simplement le tas.

Cela allouera dans le segment BSS, qui fait partie du tas:

static int c[1000000];
int main()
{
   cout << "done\n";
   return 0;
}

Cela allouera dans le segment DATA, qui fait également partie du tas:

int c[1000000] = {};
int main()
{
   cout << "done\n";
   return 0;
}

Cela allouera à un emplacement non spécifié dans le tas:

int main()
{
   int* c = new int[1000000];
   cout << "done\n";
   return 0;
}
50
Gunther Piez

De même, si vous utilisez la plupart des systèmes UNIX et Linux, vous pouvez augmenter temporairement la taille de la pile à l’aide de la commande suivante:

ulimit -s unlimited

Mais attention, la mémoire est une ressource limitée et avec un grand pouvoir viennent de grandes responsabilités :)

10
RSFalcon7

Parce que vous stockez le tableau dans la pile. Vous devriez le stocker dans le tas. Voir ce lien pour comprendre le concept du tas et de la pile.

2
Narek

Votre tableau est alloué sur la pile dans ce cas, essayez d’allouer un tableau de la même taille en utilisant alloc.

2
rerun