Libérer la mémoire contenu dans structure->p_char...
11 réponses
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 :).
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...
"Eddahbi Karim" <non.tu.ne.me.connais.pas.spavrai@Ifrance.paspam.com> a
écrit dans le message news:
pan.2003.09.25.22.45.43.519461@Ifrance.paspam.com...
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...
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...
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
"Eddahbi Karim" <non.tu.ne.me.connais.pas.spavrai@Ifrance.paspam.com> a
écrit dans le message news:
pan.2003.09.25.22.45.43.519461@Ifrance.paspam.com...
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 :)
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
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
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
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
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/
In 'fr.comp.lang.c', Eddahbi Karim
<non.tu.ne.me.connais.pas.spavrai@Ifrance.paspam.com> 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- emdelYOURBRA@noos.fr [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/
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/
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...
"Emmanuel Delahaye" <emdelYOURBRA@noos.fr> a écrit dans le message news:
Xns94029E2AB805Chsnoservernet@130.133.1.4...
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...
"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 !
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 :-/
"Laurent DELEPINE" <newsgroup@webiologie.org> a écrit dans le message
news:
3f74b553$0$20635$626a54ce@news.free.fr...
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 :-/
"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 :-/