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

Messages postés
47
Date d'inscription
vendredi 18 février 2005
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 .

--
Afficher la suite 

Votre réponse

10 réponses

Messages postés
12381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
0
Merci
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
Commenter la réponse de Whismeril
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Dernière intervention
7 janvier 2018
0
Merci
Ma valeur de INT_MAX donne 2147483647 .Alors la limitation n'est pas là.
Commenter la réponse de xbabilone
Messages postés
12381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
Commenter la réponse de Whismeril
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Dernière intervention
7 janvier 2018
0
Merci
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 .
Commenter la réponse de xbabilone
Messages postés
12381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
0
Merci
c'est pas trop sur la raison de l'erreur que je portais ton attention mais sur les options de debogage, au cas ou.
Commenter la réponse de Whismeril
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Dernière intervention
7 janvier 2018
0
Merci
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 !
Commenter la réponse de xbabilone
Messages postés
12381
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
13 décembre 2018
0
Merci
p'tet qu'il y a une spécificité avec les constantes, essaye avec un int "tout court"
Commenter la réponse de Whismeril
Messages postés
3830
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
19 novembre 2018
0
Merci
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.
Commenter la réponse de cptpingu
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Dernière intervention
7 janvier 2018
0
Merci
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 !
Commenter la réponse de xbabilone
Messages postés
47
Date d'inscription
vendredi 18 février 2005
Dernière intervention
7 janvier 2018
0
Merci
Ne tiens pas compte de ma derniere question et merci encore !
Commenter la réponse de xbabilone

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.