Y a t'il une taille maximun a un tableau statique en c++

Résolu
xbabilone Messages postés 47 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 7 janvier 2018 - Modifié le 6 janv. 2018 à 12:07
xbabilone Messages postés 47 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 7 janvier 2018 - 7 janv. 2018 à 11:20
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

Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
6 janv. 2018 à 15:13
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
0
xbabilone Messages postés 47 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 7 janvier 2018 2
6 janv. 2018 à 16:53
Ma valeur de INT_MAX donne 2147483647 .Alors la limitation n'est pas là.
0
Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
6 janv. 2018 à 17:00
0
xbabilone Messages postés 47 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 7 janvier 2018 2
Modifié le 6 janv. 2018 à 18:32
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 .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
6 janv. 2018 à 18:38
c'est pas trop sur la raison de l'erreur que je portais ton attention mais sur les options de debogage, au cas ou.
0
xbabilone Messages postés 47 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 7 janvier 2018 2
Modifié le 6 janv. 2018 à 19:38
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 !
0
Whismeril Messages postés 18417 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 5 juin 2023 624
6 janv. 2018 à 20:07
p'tet qu'il y a une spécificité avec les constantes, essaye avec un int "tout court"
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 124
6 janv. 2018 à 20:56
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.
0
xbabilone Messages postés 47 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 7 janvier 2018 2
7 janv. 2018 à 11:06
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 !
0
xbabilone Messages postés 47 Date d'inscription vendredi 18 février 2005 Statut Membre Dernière intervention 7 janvier 2018 2
7 janv. 2018 à 11:20
Ne tiens pas compte de ma derniere question et merci encore !
0