Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1067 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Allocation memoire structures

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Allocation memoire structures

n°2190561
elbarto347
Posté le 17-05-2013 à 10:22:47  profilanswer
 

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
mood
Publicité
Posté le 17-05-2013 à 10:22:47  profilanswer
 

n°2190568
Farian
Posté le 17-05-2013 à 10:58:05  profilanswer
 

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.

n°2190577
elbarto347
Posté le 17-05-2013 à 11:19:15  profilanswer
 

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.

n°2190581
Farian
Posté le 17-05-2013 à 11:43:16  profilanswer
 

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 !

n°2190688
elbarto347
Posté le 17-05-2013 à 17:00:10  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Allocation memoire structures

 

Sujets relatifs
C++ : Certification - laquelle ?Aide programmation C++ (débutant)
Peut on garder une variable php en mémoire?un exercice en C
probleme fuite de memoire[C] [Résolu] Tetris -> SDL ? Réseaux ?
Implimenter Un Menu En C Avec Allegromysql C++ code blocks
[C] Pointer de pointer de pointer[C#] Utilisation de Google Calendar
Plus de sujets relatifs à : [C] Allocation memoire structures


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR