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

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°766600
weed
Posté le 17-06-2004 à 00:01:05  profilanswer
 

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
mood
Publicité
Posté le 17-06-2004 à 00:01:05  profilanswer
 

n°766607
Taz
bisounours-codeur
Posté le 17-06-2004 à 00:07:07  profilanswer
 

non
 
et déclara ta fonctionne comme retournant void

n°766615
weed
Posté le 17-06-2004 à 00:18:05  profilanswer
 


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.  

n°766620
thermoclin​e
Geek intelligent
Posté le 17-06-2004 à 00:31:40  profilanswer
 

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.

n°766643
HelloWorld
Salut tout le monde!
Posté le 17-06-2004 à 01:23:31  profilanswer
 

Tu peux utiliser alloca.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°766662
weed
Posté le 17-06-2004 à 02:21:19  profilanswer
 

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.


n°766663
weed
Posté le 17-06-2004 à 02:24:52  profilanswer
 

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.

n°766664
weed
Posté le 17-06-2004 à 02:26:13  profilanswer
 

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

n°766679
Taz
bisounours-codeur
Posté le 17-06-2004 à 07:23:07  profilanswer
 

alloca est pas standard et relativement peu sure

n°766742
HelloWorld
Salut tout le monde!
Posté le 17-06-2004 à 09:27:38  profilanswer
 

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
mood
Publicité
Posté le 17-06-2004 à 09:27:38  profilanswer
 

n°766761
Taz
bisounours-codeur
Posté le 17-06-2004 à 09:45:09  profilanswer
 

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


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

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

 

Sujets relatifs
[RESOLU]creer une fonction[php] - Help avec fonction ereg() toujour et encore incompréhensible
pointeur de fonction membre d'une classe[CSS] plusieur feuilles de styles en fonction d'un choix
Fonction non bloquante sous telnetfonction split
[resolu]Ais je bien passer les arguments par adresse à ma fonction ?Comment appeler une fonction à l'aide d'un pointeur sur cette fonction
fonction pour connexion serveur + regex[Websphere] fonction split() de la classe String non implémenté ?
Plus de sujets relatifs à : Les blocs alloué par 1malloc sont ils libérés a la sortie d'1 fonction


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