problème désallocation mémoire (résolu)

problème désallocation mémoire (résolu) - C - Programmation

Marsh Posté le 08-11-2004 à 14:24:34    

Salut :)
 
J'ai un problème après une désallocation mémoire d'une structure de données : caractères bizarres et je comprends pas pourquoi :(
 
Voilà mon code :
 
la structure de données :

Code :
  1. typedef struct Ligne {
  2.   char * chaine;
  3.   int taille;
  4. } ligne;


 

Code :
  1. #define FREE(x) { if (x) free(x); x = NULL; }
  2. ligne * creation (int longueur)
  3. {
  4.   ligne * uneLigne;
  5.   uneLigne = (ligne *) malloc (sizeof(ligne));
  6.   uneLigne->chaine = (char*) malloc (longueur * sizeof(char));
  7.   uneLigne->taille = longueur;
  8.   return uneLigne;
  9. }
  10. void destruction (ligne * uneLigne)
  11. {
  12.   FREE(uneLigne->chaine);
  13.   FREE(uneLigne);
  14. }


 
 
La fonction qui permet d'afficher le contenu d'une ligne :

Code :
  1. void afficheStructLigne(ligne * maLigne){
  2.   if (maLigne != NULL){
  3.     printf("*** Structure ligne ***\n" );
  4.     printf("   Taille        : %d \n",maLigne->taille);
  5.     printf("   Contenu       : %s", maLigne->chaine);
  6.    }else{
  7.     printf("*** Structure ligne ***\n" );
  8.     printf("\tVide\n" );
  9.     }
  10. }


Le résultat quand je veux afficher le contenu d'une ligne devrait être null mais il m'affiche n'importe quoi :

Code :
  1. *** Structure ligne ***
  2.    Taille        : 1075192760
  3.    Contenu       : °#@°#@@@À#@À#@È#@È#@Ð#@Ð#@Ø#@Ø#@à#@à#@è#@è#@ð#@ð#@ø#@ø#@


 
Merci de m'aider ;)


Message édité par nast le 08-11-2004 à 15:32:29
Reply

Marsh Posté le 08-11-2004 à 14:24:34   

Reply

Marsh Posté le 08-11-2004 à 15:03:42    

euh c'est quoi le problème ? c'est quand tu veux afficher une ligne qui est nulle ?
Si c'est le cas c'est normal, car quand tu déclare une ligne et que tu ne l'as pas encore initialisée (i.e. pas encore fait de malloc) l'OS lui attribue un emplacement mémoire déclaré comme libre, et il se peut qu'il y ait des résidus, d'où l'importance de toujours initialiser lorsque l'on veut utiliser la variable

Reply

Marsh Posté le 08-11-2004 à 15:09:57    

c'est bien et alors ? t'as rien compris aux pointeurs. le passage de paramètre en C se fait par copie. T'auras beau passer un ligne*, ça mettra pas ton truc à NULL dans le contexte appelant.

Reply

Marsh Posté le 08-11-2004 à 15:23:05    

Taz -> en effet, je viens d'essayer de mettre mon free directement dans le programme main et ça roule :) Le problème vient donc bien du passage de paramètre par copie.
 
Comment je peux faire une fonction de destruction dans l'esprit de ce que j'ai fait plus haut ?

Reply

Marsh Posté le 08-11-2004 à 15:29:52    

c'est bon c'est résolu :)
j'ai changé ma fonction destruction par :
 

Code :
  1. ligne* destruction (ligne * uneLigne)
  2. {
  3.   FREE(uneLigne->chaine);
  4.   FREE(uneLigne);
  5.   return uneLigne;
  6. }


 
merci

Reply

Marsh Posté le 08-11-2004 à 15:48:38    

et si tu passais un ligne ** tout simplement?
au moins là tu pourras le modifier ton pointeur [:spamafote]

Reply

Marsh Posté le 08-11-2004 à 15:54:16    

je vois pas l'intérêt
 
tu fais  
 
desstruction(ma_ligne); ma_ligne = NULL; si nécessaie

Reply

Sujets relatifs:

Leave a Replay

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