[C] Allocation memoire structures

Allocation memoire structures [C] - C - Programmation

Marsh Posté le 17-05-2013 à 10:22:47    

Bonjour a tous . Je debute en C et j'ai quelques soucis avec mon code , ça compile mais ça s’exécute pas tout le temps comme il le faut
 
Voici le code :
 

Code :
  1. struct date
  2. {
  3.     int jj,mm,aa;
  4. };
  5. struct releveTemp
  6. {
  7.     struct date *D;
  8.     int temp;
  9. };
  10. void affiche(struct releveTemp **s,int taille)
  11. {
  12.     int i;
  13.     for(i=0;i<taille;i++)
  14.     {
  15.         printf("Le %d/%d/%d il faisait %d degres",s[i]->D[0].jj,s[i]->D[0].mm,s[i]->D[0].aa,s[i]->temp);  //erreur segmentation détectée ici
  16.     }
  17. }
  18. struct releveTemp saisieTemps()
  19. {
  20.     struct releveTemp a;
  21.     a.D=malloc(1*sizeof(struct date));
  22.     printf("Jour : " );
  23.     scanf("%d",&a.D[0].jj);
  24.     printf("Mois : " );
  25.     scanf("%d",&a.D[0].mm);
  26.     printf("Année : " );
  27.     scanf("%d",&a.D[0].aa);
  28.     printf("Temperature :" );
  29.     scanf("%d",&a.temp);
  30.     return a;
  31. }
  32. int main()
  33. {
  34.     int i,taille; taille=2;
  35.     struct releveTemp *test;
  36.     test=malloc(taille*sizeof(struct releveTemp));
  37.     for(i=0;i<taille;i++)
  38.     {
  39.         test[i].D=malloc(1*sizeof(struct date));
  40.         test[i]=saisieTemps();
  41.     }
  42.     affiche(&test,taille);
  43.     return 0;
  44. }

 
 
Tant que la variable taille est égale a 1 ça fonctionne mais des qu'elle est supérieure le programme s’arrête. Un erreur mémoire ? D'ou peut elle venir ?
 
Merci d'avance.
 
Edit : d'apres code blocks ça viendrai de la ligne 19
 


Message édité par elbarto347 le 17-05-2013 à 10:39:56
Reply

Marsh Posté le 17-05-2013 à 10:22:47   

Reply

Marsh Posté le 17-05-2013 à 10:58:05    

Bonjour !  
 
C'est normal, vous gérez mal votre tableau "test" entre l'allocation et l'affichage :  
 
"test" pointe vers N structures, accessibles par test[i], qui est une structure.
 
Lors de l'affichage, vous passez l'adresse de test et vous vous en servez en faisant un "(&test)[i]" et en considérant que c'est un pointeur sur une structure, alors que c'est &(test[i]) que vous auriez dû utiliser.
 
Soit vous modifiez le prototypage de la fonction affiche en lui passant un "struct releveTemps*", soit vous utilisez "(*s)[i]." au lieu de "s[i]->" dans la fonction d'affichage.  
 
Note : La première solution paraît tellement plus logique que je ne peux que vous encourager à l'utiliser.
 
Par ailleurs, vous créez une fuite mémoire en allouant test[i].D puis en faisant test[i] = ..., la mémoire allouée est perdue aussi vite car plus référencée.
 
(Je ne parle pas du fait de ne pas du tout désallouer les champs "D" du tableau test, car j'imagine que cela sera fait dans la version finale, mais pas dans le programme de test fait pour illustrer le problème).
 
D'ailleurs, pourquoi utiliser un pointeur et ne pas mettre inclure directement une structure "date" dans la structure "releveTemp" ? Cela n'a de sens que si vous voulez pointer sur une mesure externe.

Reply

Marsh Posté le 17-05-2013 à 11:19:15    

Merci de votre aide . J'ai modifié le type de la fonction affiche() et ça fonctionne !
 
 
En effet ça serai plus simple de fusionner les 2 structure mais c'est demandé comme ça :/ , pour faire bosser les tableaux de struct.

Reply

Marsh Posté le 17-05-2013 à 11:43:16    

Sans parler de fusionner les deux structures, vous déclarez simplement :  

Code :
  1. struct date
  2. {
  3.     int jj,mm,aa;
  4. };
  5. struct releveTemp
  6. {
  7.     struct date D;
  8.     int temp;
  9. };


 
Bonne continuation !

Reply

Marsh Posté le 17-05-2013 à 17:00:10    

Ah oui j'y avais pas pensé merci :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed