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 la pile ne peut gérer, donc vous obtenez un stackoverflow.
Ne l'allouez pas localement sur la pile, utilisez plutôt un autre emplacement. Cela peut être réalisé en créant l'objet global ou en l'affectant sur le tas global. Les variables globales sont correctes si vous n'utilisez pas l'option de n'importe quelle autre unité de compilation. Pour vous assurer que cela ne se produit pas par accident, ajoutez un spécificateur de stockage statique, sinon utilisez simplement le tas.
Cela affectera dans le segment BSS, qui fait partie du tas:
static int c[1000000];
int main()
{
cout << "done\n";
return 0;
}
Cette allouera dans le segment DATA, qui fait partie du tas trop:
int c[1000000] = {};
int main()
{
cout << "done\n";
return 0;
}
Cette
attribuera à un endroit non précisé dans le tas:
int main()
{
int* c = new int[1000000];
cout << "done\n";
return 0;
}
Merci pour la réponse, mais pourriez-vous m'expliquer pourquoi les tableaux sont alloués sur la pile et pourquoi pas dans la mémoire principale du programme. – Mayank
Le code donné est alloué sur la pile car il est spécifié en tant que tableau avec un nombre constant d'éléments lors de la compilation. Les valeurs ne sont mises dans le tas qu'avec malloc, new, etc. –
Toutes les varables automatiques sont allouées sur la pile. Si vous regardez le défaut, vous verrez la taille de vos variables locales soustraite du pointeur de la pile.Lorsque vous appelez malloc ou calloc ou l'une des fonctions mémoire, les fonctions vont et trouvent des blocs de mémoire assez grand pour satisfer votre demande. – rerun