Les blocs alloué par 1malloc sont ils libérés a la sortie d'1 fonction

Les blocs alloué par 1malloc sont ils libérés a la sortie d'1 fonction - C - Programmation

Marsh Posté le 17-06-2004 à 00:01:05    

voila je m'interrogeais sur la porté d'un malloc dans une fonction
 

Code :
  1. void fonction (char **);
  2. void fonction (char **entete)
  3. {
  4. char *tmp = malloc (20);
  5. // je fais des affectation dans tmp avec strcpy  
  6. // et apres je recupere son adresse et je l'a copie dans *entete
  7. if (entete != NULL) free (*entete)
  8. *entete = tmp;
  9. printf("%s",*entete); //OK
  10. }
  11. int main ()
  12. {
  13. char *buffer = NULL;
  14. fonction (&buffer);
  15. printf("%s",buffer); //pas pris en compte
  16. return 0;


 
je peux afficher les caracctere de entete dans la fonction mais des que je sors, ce n'est plus pris en compte ...
 
je pensais qu'avec un malloc, lorsque l'on sortais de la fonction, les blocs alloué n'etait pas libéré.
}


Message édité par weed le 17-06-2004 à 00:18:44
Reply

Marsh Posté le 17-06-2004 à 00:01:05   

Reply

Marsh Posté le 17-06-2004 à 00:07:07    

non
 
et déclara ta fonctionne comme retournant void

Reply

Marsh Posté le 17-06-2004 à 00:18:05    


les blocs sont libéré a la sortie de la fonction
 
[citation=766607,0,2][nom]Taz a écrit[/nom]
et déclara ta fonctionne comme retournant void
oui j'ai fais ca vite fais, en effet,  il faut mettre  
void fonction (char **entete)
 
alors la seul solution pour recupere une chaine de caractere c'est de faire une copie de tout les elements de tmp dans *entete et non pas une simple copie d'adresse du bloc de tmp...
 
Si c'est bien ca, dommage. Je trouvais ca tres propre.  

Reply

Marsh Posté le 17-06-2004 à 00:31:40    

weed a écrit :

les blocs sont libéré a la sortie de la fonction
 
alors la seul solution pour recupere une chaine de caractere c'est de faire une copie de tout les elements de tmp dans *entete et non pas une simple copie d'adresse du bloc de tmp...
 
Si c'est bien ca, dommage. Je trouvais ca tres propre.


 
Mais non, les blocs ne sont pas liberes a la sortie de la fonction, c'est ce qu'il voulait te dire justement...
Tu trouves ca tres propre? Moi pas parce qu'a chaque malloc, il faut son free correspondant, ce que tu ne fais pas ici.

Reply

Marsh Posté le 17-06-2004 à 01:23:31    

Tu peux utiliser alloca.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-06-2004 à 02:21:19    

Citation :

NOM
       alloca - Allocation mémoire.
 
SYNOPSIS
       #include <stdlib.h>
 
       void *alloca (size_t size);
 
DESCRIPTION
       La  fonction  alloca  alloue  size  octets  dans  l'espace  de  pile de
       l'appelant. Cet espace temporaire est automatiquement  libéré  lors  du
       retour de la fonction ayant invoqué alloca.


ca a l'air d'etre genial. Si j'ai bien compris n a plus besoin de faire de free si on rappelle calloc avec le meme pointeur.
 
mais par contre ce qui est dommage :

Citation :

BOGUES
       La fonction alloca dépend de la machine et du  compilateur.  Son  usage
       est déconseillé.
 
       Sur beaucoup de systèmes alloca ne doit pas être utilisée au sein de la
       liste des arguments d'un  appel  de  fonction,  car  l'espace  de  pile
       réservé  par  alloca  se trouverait alors au milieu de l'espace utilisé
       par les arguments de la fonction.


Reply

Marsh Posté le 17-06-2004 à 02:24:52    

thermocline a écrit :

Mais non, les blocs ne sont pas liberes a la sortie de la fonction, c'est ce qu'il voulait te dire justement...
Tu trouves ca tres propre? Moi pas parce qu'a chaque malloc, il faut son free correspondant, ce que tu ne fais pas ici.


 
je trouve ca genial car on ne deplace pas les données pour rien :
Faire une allocation d'un nouveau bloc  
puis copié ...
Pour moi y a pas plus optimisé. L'espace memoire est deja créé, autant le reutiliser.  
 
 
Et bien quand je n'aurais plus besoin de ce bloc memoire, j'indiquerais a quel adresse ou il faut qu'il libere a l'aide d'un pointeur.

Reply

Marsh Posté le 17-06-2004 à 02:26:13    

ehh au fait vous avez bien raison, cela fonctionne maintenant,  
ahh les mystere de l'informatique

Reply

Marsh Posté le 17-06-2004 à 07:23:07    

alloca est pas standard et relativement peu sure

Reply

Marsh Posté le 17-06-2004 à 09:27:38    

moi je m'en sert de temps en temps pour ces cas là : une chaine temporaire. alloca a l'avantage d'être très rapide.
C'est pas standard, mais dispo sous Windows, ce qui m'incite à penser qu'elle est généralement présente.
Y'a pas la possibilité de créer des tableau de taille non constante en C99 ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 17-06-2004 à 09:27:38   

Reply

Marsh Posté le 17-06-2004 à 09:45:09    

si. mais faut toujours faire attention, parce que si ton [n] est trop grand, tu fais péter ta pile, et là t'auras pas de NULL retourné pour te dire que l'allocation a échouée

Reply

Sujets relatifs:

Leave a Replay

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