passage par adresse, malloc et free.

passage par adresse, malloc et free. - C - Programmation

Marsh Posté le 29-05-2006 à 17:03:20    

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.
Reply

Marsh Posté le 29-05-2006 à 17:03:20   

Reply

Marsh Posté le 29-05-2006 à 17:13:20    

Reply

Marsh Posté le 29-05-2006 à 17:19:59    

merci :o


---------------
Les hommes n'acceptent le changement que dans la nécessité et ils ne voient la nécessité que dans la crise.
Reply

Marsh Posté le 29-05-2006 à 19:18:55    

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.
Reply

Marsh Posté le 29-05-2006 à 19:43:26    

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

Reply

Marsh Posté le 29-05-2006 à 21:47:53    


 
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).

Reply

Marsh Posté le 29-05-2006 à 22:41:31    

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/
Reply

Marsh Posté le 30-05-2006 à 15:21:13    

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.
Reply

Marsh Posté le 30-05-2006 à 15:48:43    

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.
Reply

Marsh Posté le 30-05-2006 à 19:33:25    

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/
Reply

Marsh Posté le 30-05-2006 à 19:33:25   

Reply

Marsh Posté le 05-06-2008 à 17:33:18    

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.

Reply

Marsh Posté le 05-06-2008 à 17:36:06    

nan hein.

Reply

Marsh Posté le 05-06-2008 à 17:48:45    

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/
Reply

Marsh Posté le 12-06-2008 à 15:14:15    

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.
Reply

Marsh Posté le 12-06-2008 à 17:31:32    

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

Reply

Marsh Posté le 12-06-2008 à 20:37:50    

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
Reply

Sujets relatifs:

Leave a Replay

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