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

  FORUM HardWare.fr
  Programmation
  C

  passage par adresse, malloc et free.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

passage par adresse, malloc et free.

n°1376838
Tounet
I love apples
Posté le 29-05-2006 à 17:03:20  profilanswer
 

Petite question sur le malloc pour etre sur d'avoir compris. L'allocation se fait sur la pile ? c'est a dire qu'une allocation dynamique de pointeur, passée par adresse p-e valable dans n'importe quelle fonction ?
 
Un petit exemple pour illustrer :
 
si j'ai :  
 

Code :
  1. char *a, *b;
  2. // avec une fonction qui va modifier ces chaines, mais dont je ne connais pas la taille à l'avance.
  3. modif(&a,&b);


 
Est ce que je peux faire le malloc dans la fonction appelée puis liberer plus tard dans ma fonction appelante ?

Message cité 2 fois
Message édité par Tounet le 29-05-2006 à 17:06:49

---------------
Les hommes n'acceptent le changement que dans la nécessité et ils ne voient la nécessité que dans la crise.
mood
Publicité
Posté le 29-05-2006 à 17:03:20  profilanswer
 

n°1376844
Taz
bisounours-codeur
Posté le 29-05-2006 à 17:13:20  profilanswer
 
n°1376849
Tounet
I love apples
Posté le 29-05-2006 à 17:19:59  profilanswer
 

merci :o


---------------
Les hommes n'acceptent le changement que dans la nécessité et ils ne voient la nécessité que dans la crise.
n°1376957
Sve@r
Posté le 29-05-2006 à 19:18:55  profilanswer
 

Tounet a écrit :

Est ce que je peux faire le malloc dans "modif" puis liberer plus tard dans ma fonction appelante ?


A condition que le prototype de "modif" soit

Code :
  1. <type> modif(char **x, char **y);


et dans "modif", toutes tes références à "a" seront nommées "*x" (idem pour b)...


Message édité par Sve@r le 29-05-2006 à 19:20:04

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1376967
P-Y
Posté le 29-05-2006 à 19:43:26  profilanswer
 

euh quand tu alloues avec malloc(), l'addresse retournee est quelquepart dans le tas et pas dans la pile :heink:

n°1377034
simple_stu​pid
Keep It Simple Stupid
Posté le 29-05-2006 à 21:47:53  profilanswer
 


 
Bah alors Taz t'es fatigué?
 

Tounet a écrit :

Petite question sur le malloc pour etre sur d'avoir compris. L'allocation se fait sur la pile ?


 
NON!
La pile est une structure fluctuante.
Lorsque tu sors d'une fonction, tu "dépiles" toutes les variables locales (entre autre) qui ont été allouées dans cette fonctions.
Au contraire, malloc te renvoie un pointeur vers une zone de mémoire plus permanente, allouée dans le tas (heap en anglais).
 
C'est un autre segment qui fait partie de l'espace d'adressage de ton processus.
Tant que tu ne la free() pas, elle reste là. C'est ça le gros problème de malloc(), c'est qu'on arrive vite à des fuites de mémoire.
Après, tu peux accèder à la zone de mémoire pointée depuis l'ensmble de ton programme (pour peu que tu aies acccès au pointeur).
Mais si tu "perds" ce pointeur, bah c'est terminé, tu ne pourras plus récupérer la mémoire.
Donc tu alloues un bloc avec malloc(size_t ma_taille).
Tu joues avec comme si c'était un tableau, depuis n'importe où.
Tu le libères avec free().
Sinon t'as unéquivalent de malloc, qui te renvoie un bloc alloué sur la pile, donc qui se libère automatiquement quand ta fonction retourne.
C'est alloca(), et c'est une merde sans nom. Si tu l'utilises tu brûleras en enfer jusqu'à la fin de ta vie après la mort (et ça risque d'être long).

n°1377089
Emmanuel D​elahaye
C is a sharp tool
Posté le 29-05-2006 à 22:41:31  profilanswer
 

Tounet a écrit :

Petite question sur le malloc pour etre sur d'avoir compris. L'allocation se fait sur la pile ?


Non. Elle se fait dans un bloc mémoire indépendant souvent appelé le tas (heap ou free store) Les données sont persistantes, jusqu'au free() correspondant (même adresse).

Citation :

c'est a dire qu'une allocation dynamique de pointeur, passée par adresse p-e valable dans n'importe quelle fonction ?


Une "allocation dynamique de pointeur", ça n'a aucun sens.  
 
malloc() alloue un bloc mémoire d'une taille utile en bytes égale à la valeur passée en paramètre, et retourne son adresse si il a réussi ou NULL en cas d'échec. Pour se souvenir de l'adresse, on la mémorise dans la seule variable conçue à cet effet qui est un pointeur. Cette variable étant typée, elle permet ensuite d'accéder à l'élément pointé, (ou aux éléments si c'est un tableau ou une structure ou tout autre type complexe), grâce à l'arithmétique des pointeurs.

Citation :


Code :
  1. char *a, *b;
  2. // avec une fonction qui va modifier ces chaines, mais dont je ne connais pas la taille à l'avance.
  3. modif(&a,&b);


 
Est ce que je peux faire le malloc dans la fonction appelée puis liberer plus tard dans ma fonction appelante ?

Oui.  
 
Mais char *a et char *b ne sont pas des chaines... Ce ne sont que des pointeurs. C'est le contenu des blocs pointés qui peut être ou non une chaine valide...
 
http://mapage.noos.fr/emdel/notes.htm#char_star


Message édité par Emmanuel Delahaye le 29-05-2006 à 22:45:10

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1377621
Tounet
I love apples
Posté le 30-05-2006 à 15:21:13  profilanswer
 

Merci pour les precisions.
Question supplémentaire :
Comment ca se passe alors avec argc et argv ? Quand on passe des parametres au programmes, la memoire est allouée au lancement ?


---------------
Les hommes n'acceptent le changement que dans la nécessité et ils ne voient la nécessité que dans la crise.
n°1377640
Sve@r
Posté le 30-05-2006 à 15:48:43  profilanswer
 

Tounet a écrit :

Merci pour les precisions.
Question supplémentaire :
Comment ca se passe alors avec argc et argv ? Quand on passe des parametres au programmes, la memoire est allouée au lancement ?


 
C'est comme si tu demandais si la mémoire est allouée pour tous les "int i,j,k..." que t'as dans ton programme...
argc et argv sont des variables permettant d'accèder aux paramètres du programme.
Lorsque tu lances "pgm toto titi tata", ton shell place les chaînes "toto", "titi" et "tata" dans la mémoire du processus et stocke les adresses de ces chaînes dans un tableau (donc un tabeau d'adresses donc un char *[]) que tu récupères en 2° paramètre de "main()".
Cette mémoire n'est pas allouée, elle est donnée d'entrée à tous les processus et elle a évidemment une taille limite (t'as jamais vu, lorsque tu fais "commande_quelconque *" pour traiter tous les fichiers, le message "commande_quelconque: arg list too long" ???)
 
Donc pas d'allocation => pas de "free"


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1377754
Emmanuel D​elahaye
C is a sharp tool
Posté le 30-05-2006 à 19:33:25  profilanswer
 

Tounet a écrit :

Comment ca se passe alors avec argc et argv ? Quand on passe des parametres au programmes, la memoire est allouée au lancement ?


Je ne sais pas et je ne veux pas le savoir. C'est de la bidouille interne auto-démerdante... Du moment que ça marche...


Message édité par Emmanuel Delahaye le 30-05-2006 à 19:33:40

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
mood
Publicité
Posté le 30-05-2006 à 19:33:25  profilanswer
 

n°1742146
NounouRs
Non parce que c pas mon pied !
Posté le 05-06-2008 à 17:33:18  profilanswer
 

Le plus propre, c'est de se debrouiller pour pouvoir faire le malloc et le free dans la meme procedure, quoi qu'il en coute.

n°1742150
Taz
bisounours-codeur
Posté le 05-06-2008 à 17:36:06  profilanswer
 

nan hein.

n°1742162
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-06-2008 à 17:48:45  profilanswer
 

NounouRs a écrit :

Le plus propre, c'est de se debrouiller pour pouvoir faire le malloc et le free dans la meme procedure, quoi qu'il en coute.


Bah ça dépend totalement de l'application...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
n°1745505
Tounet
I love apples
Posté le 12-06-2008 à 15:14:15  profilanswer
 

Pkoi on deterre mon sujet  :??:


---------------
Les hommes n'acceptent le changement que dans la nécessité et ils ne voient la nécessité que dans la crise.
n°1745589
bjone
Insert booze to continue
Posté le 12-06-2008 à 17:31:32  profilanswer
 

c'est parcequ'on cherche de l'eau pour le pastis.

n°1745667
mIRROR
Chevreuillobolchévik
Posté le 12-06-2008 à 20:37:50  profilanswer
 

Tounet a écrit :

Pkoi on deterre mon sujet  :??:


 
pour moi qui debute c etait super instructif donc y a pas de mal :o
 

bjone a écrit :

c'est parcequ'on cherche de l'eau pour le pastis.


 
approved


---------------
« The enemy is the gramophone mind, whether or not one agrees with the record that is being played at the moment. » — George Orwell

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

  passage par adresse, malloc et free.

 

Sujets relatifs
Ouverture en PHP de fichiers > 5 Mo chez FREE.Récupération de l'adresse ip avec recvfrom() [Débutant]
Changement comportement fonctions suite passage PHP5Fonction qui renvoit l'adresse du serveur web
Tester divisibilité d'une adresse mémoireMenu onglets changeant au passage de la souris
Socket Adresse IPComment avoir une adresse mail special
Agrandir une photo au passage de la sourisPassage de références de tableaux dans l'url
Plus de sujets relatifs à : passage par adresse, malloc et free.


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