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
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
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
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
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
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
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
17329
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
17 mai 2022
596
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
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
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