Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Libérer la mémoire contenu dans structure->p_char...

11 réponses
Avatar
Eddahbi Karim
Bonjour/Bonsoir (rayez votre écran si ça vous chante)

Comment faire pour libérer une ressource contenu dans un pointeur de
structure via free ?

Par exemple :

typedef struct {
char *pabo;
} test;

void vide_tout ( test *foo )
{
free(???);
}

int main ( void )
{
test foo = {NULL};

foo.pasbo = "BLA";

vide_tout( &foo )

return 0;
}

Je sais que *foo c'est la référence de la structure.
&foo c'est l'adresse de la structure.
Par contre foo->pabo c'est quoi ?

Je fais comment pour libérer foo->pasbo.

J'ai cherche un peu dans les Google groups, et apparemment y'a pas ce
genre de questions. (J'ai récolté une leçon sur les pointeurs de Delahaye
en passant)

J'ai l'impression que ma méthode est mauvaise (j'aurais innové en matière
de mauvaise conception en C ? :))
Si c'est si mauvais, comment rectifier ça pour que je puisse libérer toute
la mémoire.

Merci,

PS : * et &, ça doit être les choses que j'assimile le moins, même avec mon
bouquin.
Pour moi *machin c'est un peu comme les définitions qu'on voit dans les
bouquins et & ça donne son adresse :).

--
ThE_TemPLaR

10 réponses

1 2
Avatar
Stephane Legras-Decussy
"Eddahbi Karim" a
écrit dans le message news:


Comment faire pour libérer une ressource contenu dans un pointeur de
structure via free ?


je crois qu'on ne peut liberer avec free que de la memoire
dynamique allouée avec malloc...

y'a pas de malloc dans ton exemple...
donc y'a que de la memoire automatique
et on ne peut pas la libérer...

Avatar
Eddahbi Karim


"Eddahbi Karim" a
écrit dans le message news:


Comment faire pour libérer une ressource contenu dans un pointeur de
structure via free ?


je crois qu'on ne peut liberer avec free que de la memoire
dynamique allouée avec malloc...

y'a pas de malloc dans ton exemple...
donc y'a que de la memoire automatique
et on ne peut pas la libérer...


Mais la mémoire n'est pas statique non plus...
Donc ma conception est fausse :)

Bon ben merci ;)

--
ThE_TemPLaR


Avatar
Bertrand Mollinier Toublet
Eddahbi Karim wrote:
Bonjour/Bonsoir (rayez votre écran si ça vous chante)

Comment faire pour libérer une ressource contenu dans un pointeur de
structure via free ?

Par exemple :

typedef struct {
char *pabo;
} test;

void vide_tout ( test *foo )
{
free(???);
}

Alors, foo est ton pointeur vers ta structure. Donc *foo est ta

structure elle-meme. Donc (*foo).pabo est ton pointeur de char. Ca
s'ecrit aussi foo->pabo.

Donc dans ta fonction, tu veux faire:
{
free(foo->pabo);
}

int main ( void )
{
test foo = {NULL};

foo.pasbo = "BLA";


Tu es bien conscient que tu n'as pas alloue l'espace pour stocker cette
chaine de caractere, et que c'est le systeme qui s'en est charge tout
seul pour toi...

vide_tout( &foo )

... et que donc tu n'as *absolument* pas le droit de la liberer...


return 0;
}

Je sais que *foo c'est la référence de la structure.
&foo c'est l'adresse de la structure.
Par contre foo->pabo c'est quoi ?

Alors, il y a plusieurs trucs a voir. Dans un contexte de declaration, *

veut dire 'pointeur vers'. Par exemple:

char *pabo;

veut dire que pabo est un pointeur vers un char.

Dans un contexte d'expression, * est un dereferencement. Par exemple:

*pabo = 'a';

veut dire: on met 'a' dans l'endroit pointe par pabo (bien entendu, il
faut d'abord avoir alloue pabo, mais c'est un autre probleme.

Enfin, & est l'oppose de * dans un contexte d'expression. Par exemple:

char *pabo;
char c;

pabo = &c;

veut dire que le pointeur de char pabo pointe maintenant vers c. Car on
lui a assigne l'addresse de c.

Maintenant, considerons les structures. . permet d'acceder a un membre
d'une structure. Par exemple:

struct {
char *pabo;
} s;
char *c;

s.pabo = &c;

veut dire: s.pabo est un pointeur de char et on lui assigne l'adresse de
c. Maintenant, quand on a un pointeur vers une structure, c'est lourd de
tout le temps ecrire (*ps).pabo. Et il se trouve que -> est un racourci
pour (* ). Par exemple:

struct {
char *pabo;
} *ps;
char *c;

ps->pabo = &c;
*(ps->pabo) = 'a';

veut dire que ps->pabo est un pointeur de char et on lui assigne
l'adresse de c. Ensuite, dans le char pointe par ps->pabo, on met 'a'.

Je fais comment pour libérer foo->pasbo.

Ca, c'est pas dur:

Q "Je fais comment pour liberer lambda ?"
A "free(lambda);"



--
Bertrand Mollinier Toublet
"Bikes are like ladies, if you don't take care of them all the time,
when you feel like going back to them, it takes a lot of work"
-- Riccardo Turchetto

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', Eddahbi Karim
wrote:

Comment faire pour libérer une ressource contenu dans un pointeur de
structure via free ?


A-t-elle été allouée par malloc() (ou ses soeurs)?

Par exemple :

typedef struct {
char *pabo;
} test;

void vide_tout ( test *foo )
{
free(???);
}

int main ( void )
{
test foo = {NULL};

foo.pasbo = "BLA";

vide_tout( &foo )

return 0;
}


Il n'a y pas eu d'allocation, dont il ne FAUT PAS faire de free().

PS : * et &, ça doit être les choses que j'assimile le moins, même avec mon
bouquin.
Pour moi *machin c'est un peu comme les définitions qu'on voit dans les
bouquins et & ça donne son adresse :).


Tu devrais t'acheter un vrai livre de C, comme le Kernighan et Ritchie ed. 2.

Le sens de '*' dépend du contexte :

int *p; /* definition d'un pointeur */

x = *p; /* dereferencement d'un pointeur (acces a la valeur pointee) */

x = a * b; /* multiplication */

Le sens de '&' est plus simple. C'est un opérateur qui retourne l'adresse
d'un objet (ou d'une fonction).

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Stephane Legras-Decussy
"Emmanuel Delahaye" a écrit dans le message news:


Le sens de '*' dépend du contexte :



j'ai tenté d'enseigner les bases de C à quelques personnes,
et c'est vraiment *LE* gros point obscur du C
qui embrouille tout le monde...

2 caracteres distincts auraient été plus judicieux...

Avatar
Laurent DELEPINE
Stephane Legras-Decussy wrote:
"Emmanuel Delahaye" a écrit dans le message news:


Le sens de '*' dépend du contexte :




Le nombre de caractere disponible sur toutes les consoles est limité.


A+

LD


Avatar
Stephane Legras-Decussy
"Laurent DELEPINE" a écrit dans le message news:
3f74b553$0$20635$
Le nombre de caractere disponible sur toutes les consoles est limité.


euh... je sais pas... $ par exemple ? y'a pas partout ?

Avatar
Bertrand Mollinier Toublet
Stephane Legras-Decussy wrote:
"Laurent DELEPINE" a écrit dans le message news:
3f74b553$0$20635$

Le nombre de caractere disponible sur toutes les consoles est limité.



euh... je sais pas... $ par exemple ? y'a pas partout ?


Honnetement, si le C utilisait $ comme operateur de referencement, je

pense que je n'en ferait pas. Dans la vie, il y a des limites a
l'esthetisme a ne pas franchir.

--
Bertrand Mollinier Toublet
Snob du C. Hmpf !


Avatar
Bertrand Mollinier Toublet
Bertrand Mollinier Toublet wrote:

Stephane Legras-Decussy wrote:

"Laurent DELEPINE" a écrit dans le message
news:
3f74b553$0$20635$

Le nombre de caractere disponible sur toutes les consoles est limité.




euh... je sais pas... $ par exemple ? y'a pas partout ?


Honnetement, si le C utilisait $ comme operateur de referencement, je

de *de*referencement

pense que je n'en ferait pas. Dans la vie, il y a des limites a
n'y toucherais pas

l'esthetisme a ne pas franchir.



Pardon, je suis un peu fatigue. A ma decharge, je viens de me taper une
apres-midi de tutoriel XML en anglais et ca a un peu affecte ma capacite
a penser en francais :-/

--
Bertrand Mollinier Toublet
int main(){char*strchr();int j34;char t[]=":@abcdefghij-lmnopqrstuv"
"wxyz.n",*i="iqgbgxmbbla.llsvoaz:";while
(*i){j+=strchr(t,*i++)-t;j%=sizeof t-1;putchar(t[j]);}return 0;}



Avatar
Stephane Legras-Decussy
"Bertrand Mollinier Toublet"
a écrit dans le message
news:
Dans la vie, il y a des limites a
l'esthetisme a ne pas franchir.


t'aimais pas les

10 INPUT A$

sur ton MO5 ? ;-)

PS: sondage : quel est le plus bel opérateur du C ?
pour moi c'est && , et vous ?

1 2