Y a t'il une taille maximun a un tableau statique en c++ [Résolu]

Signaler
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Statut
Membre
Dernière intervention
7 janvier 2018
-
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Statut
Membre
Dernière intervention
7 janvier 2018
-
Bonjour, et bonne année !

Je suis sous ubuntu et je compile avec"gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.5)" .

Voici mes option de compilation : g++ -Wall *.cc -o exec

Voici mon code


  
int main(void)
{
const int n = 10000000;
int array [n];

for (int i =0 ; i<n ; i ++)array[i]=0;
for (int i =0 ; i<n ; i ++)array[i]++;


return 0;
}


A l'éxecution j'ai une erreur de segmentation .Si je passe 1000000 a n il n'y a plus d'erreur .Alors où est le probleme ?
On dirai que passer une certaine taille cela plante .

--

10 réponses

Messages postés
15933
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021
545
Bonjour
C++ c'est pas trop mon truc donc je ne sais pas te dire s'il y a une taille maxi pour un tableau.
Par contre c'est sûr il y a une valeur maxi pour les int. Comme elle dépend de ton OS, je ne suis pas certain que le problème vienne de là.
Si on se réfère à cette page
http://www.cplusplus.com/reference/climits/ tu es largement au dessus de 32767

Du coup, tu peux peut être tester
int main(void) 
{ 
   const int n = 10000000;
   //int array [n];
 
   //for (int i =0 ; i<n ; i ++)array[i]=0;
   //for (int i =0 ; i<n ; i ++)array[i]++;
 

   return 0; 
}

Si ceci plante, alors c'est que la valeur dépasse la capacité d'un int sur ton ordi
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Statut
Membre
Dernière intervention
7 janvier 2018
2
Ma valeur de INT_MAX donne 2147483647 .Alors la limitation n'est pas là.
Messages postés
15933
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021
545
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Statut
Membre
Dernière intervention
7 janvier 2018
2
Merci de ton attention !
Une erreur de segmentation c'est quand on essaye d'accéder a une adresse mémoire qui n'appartient pas au programme mais là ce n'est pas le cas .Si j'essaye de créer le même tableau en dynamique ça fonctionne nickel.Alors où est le problème ?
Je sais que la place necessaire pour un tableau statique est gerer par le compilateur et pas a l'execution .Je pense donc qu 'il doit y avoir une taille au dessus de laquelle le compilateur merdoye .
Messages postés
15933
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021
545
c'est pas trop sur la raison de l'erreur que je portais ton attention mais sur les options de debogage, au cas ou.
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Statut
Membre
Dernière intervention
7 janvier 2018
2
merci
J'ai passé mon programme danx gdb et

Program received signal SIGSEGV, Segmentation fault.
main () at main.cc:30
30 const int n = 10000000;

En fait ça plante des le remplissage de la constante !
Messages postés
15933
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
14 mai 2021
545
p'tet qu'il y a une spécificité avec les constantes, essaye avec un int "tout court"
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
Bonjour.

Il faut bien différencier stack et heap. La stack est un endroit on affecte des variables rapidement sur un contexte (variables locales, arguments, tableaux statiques, etc..) tandis que dans le heap on y met un peu tout.
La stack est limitée par la "stack size", le heap par la ram sur ton ordinateur.
Donc créer trop de variables locales, ou créer un tableau statique local trop gros (supérieur à la stack trace), fera planter ton programme. La stack size dépend de ton environnement (environ 1Mo sous Windows, et la valeur de ulimit -s sous Linux). Tu peux la changer, mais généralement quand tu dépasses la stack size par défaut, c'est que tu fais mal quelque chose :).

Pas de souci quand tu alloues, vu que ça passe sur le heap.
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Statut
Membre
Dernière intervention
7 janvier 2018
2
Merci pour ta reponse . En résume les déclarations statique de tableaux sont limités par la taille de la pile .
Chez moi ulimit -s donne 8192 ko.

Pour cela c'est ok .

Y a t'il une limitation lorsque l'on déclare une constante ?
Parceque avec "const int n = 10000000;"
ça plante des le remplissage de la constante !
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Statut
Membre
Dernière intervention
7 janvier 2018
2
Ne tiens pas compte de ma derniere question et merci encore !