j'ai honte poser une question aussi basique
mais je ne dois pas avoir les yeux en face des trous
et je ne comprend pas ce qui ne va pas depuis plusieures heures :
Le 23/03/05 22:43, dans <4241e2a3$0$2782$, « Stephane Legras-Decussy » a écrit :
#include <stdio.h> #include<conio.h>
Pas standard
#include<stdlib.h>
typedef struct { int nbr;
}AA;
void init(AA *aa) { aa= (AA*)malloc(sizeof(AA));
Cast inutile
}
int main(int argc, char *argv[]) { AA *aa=NULL;
// init(aa); // (1)
aa= (AA*)malloc(sizeof(AA)); // (2)
aa->nbr; // (3)
printf("%dn",aa->nbr);
getch();
Pas standard
free(aa);
return 0; }
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la variable aa et init doit modifier cette valeur :
-- Éric Lévénez -- <http://www.levenez.com/> Unix is not only an OS, it's a way of life.
Le 23/03/05 22:43, dans <4241e2a3$0$2782$636a15ce@news.free.fr>, « Stephane
Legras-Decussy » <admin@dtc.fr> a écrit :
#include <stdio.h>
#include<conio.h>
Pas standard
#include<stdlib.h>
typedef struct
{
int nbr;
}AA;
void init(AA *aa)
{ aa= (AA*)malloc(sizeof(AA));
Cast inutile
}
int main(int argc, char *argv[])
{ AA *aa=NULL;
// init(aa); // (1)
aa= (AA*)malloc(sizeof(AA)); // (2)
aa->nbr; // (3)
printf("%dn",aa->nbr);
getch();
Pas standard
free(aa);
return 0;
}
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen
de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la
variable aa et init doit modifier cette valeur :
Le 23/03/05 22:43, dans <4241e2a3$0$2782$, « Stephane Legras-Decussy » a écrit :
#include <stdio.h> #include<conio.h>
Pas standard
#include<stdlib.h>
typedef struct { int nbr;
}AA;
void init(AA *aa) { aa= (AA*)malloc(sizeof(AA));
Cast inutile
}
int main(int argc, char *argv[]) { AA *aa=NULL;
// init(aa); // (1)
aa= (AA*)malloc(sizeof(AA)); // (2)
aa->nbr; // (3)
printf("%dn",aa->nbr);
getch();
Pas standard
free(aa);
return 0; }
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la variable aa et init doit modifier cette valeur :
-- Éric Lévénez -- <http://www.levenez.com/> Unix is not only an OS, it's a way of life.
Pierre Maurette
[...]
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la variable aa et init doit modifier cette valeur : [...]
Ou alors:
AA* init(void){return (AA *) malloc(sizeof(AA));}
/* ..... */
aa = init();
-- Pierre
[...]
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen
de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la
variable aa et init doit modifier cette valeur :
[...]
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la variable aa et init doit modifier cette valeur : [...]
Ou alors:
AA* init(void){return (AA *) malloc(sizeof(AA));}
/* ..... */
aa = init();
-- Pierre
Eric Levenez
Le 23/03/05 22:58, dans <4241e669$0$5353$, « Pierre Maurette » a écrit :
[...]
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la variable aa et init doit modifier cette valeur : [...]
Ou alors:
AA* init(void){return (AA *) malloc(sizeof(AA));}
/* ..... */
aa = init();
Oui, mais toujours sans le cas (AA *).
-- Éric Lévénez -- <http://www.levenez.com/> Unix is not only an OS, it's a way of life.
Le 23/03/05 22:58, dans <4241e669$0$5353$626a14ce@news.free.fr>, « Pierre
Maurette » <maurettepierre@wanadoo.fr> a écrit :
[...]
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen
de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la
variable aa et init doit modifier cette valeur :
[...]
Ou alors:
AA* init(void){return (AA *) malloc(sizeof(AA));}
/* ..... */
aa = init();
Oui, mais toujours sans le cas (AA *).
--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Le 23/03/05 22:58, dans <4241e669$0$5353$, « Pierre Maurette » a écrit :
[...]
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la variable aa et init doit modifier cette valeur : [...]
Ou alors:
AA* init(void){return (AA *) malloc(sizeof(AA));}
/* ..... */
aa = init();
Oui, mais toujours sans le cas (AA *).
-- Éric Lévénez -- <http://www.levenez.com/> Unix is not only an OS, it's a way of life.
init() recoit un pointeur sur une structure AA. Elle modifie ce pointeur puis elle retourne. Mais cette modification est perdue. C'est comme avec un entier et un niveau d'indirection de moins.
void init(int aa) { aa = 42; }
int main(void) { int aa = 0; init(aa); printf("%dn", aa); }
Ce programme n'affichera jamais 42. C'est pareil si on met un niveau d'indirection de plus. Donc deux solutions :
void init(AA** aa) { aa = malloc(sizeof(AA)); }
ou bien
AA* init(void) { return malloc(sizeof(AA)); }
si j'écris la ligne (2), tout va bien, si je remplace par la ligne (1) alors le prog crash en ligne (3).
Et le fait qu'il crashe en ligne 3 était dû au fait que aa valait NULL. Etant donné que aa est NULL, aa->nbr crash lamentablement.
init() recoit un pointeur sur une structure AA. Elle modifie ce pointeur
puis elle retourne. Mais cette modification est perdue. C'est comme avec un
entier et un niveau d'indirection de moins.
void init(int aa)
{
aa = 42;
}
int main(void) {
int aa = 0;
init(aa);
printf("%dn", aa);
}
Ce programme n'affichera jamais 42.
C'est pareil si on met un niveau d'indirection de plus. Donc deux solutions
:
void init(AA** aa)
{
aa = malloc(sizeof(AA));
}
ou bien
AA* init(void)
{
return malloc(sizeof(AA));
}
si j'écris la ligne (2), tout va bien, si je remplace par la ligne (1)
alors
le prog crash en ligne (3).
Et le fait qu'il crashe en ligne 3 était dû au fait que aa valait NULL.
Etant donné que aa est NULL, aa->nbr crash lamentablement.
init() recoit un pointeur sur une structure AA. Elle modifie ce pointeur puis elle retourne. Mais cette modification est perdue. C'est comme avec un entier et un niveau d'indirection de moins.
void init(int aa) { aa = 42; }
int main(void) { int aa = 0; init(aa); printf("%dn", aa); }
Ce programme n'affichera jamais 42. C'est pareil si on met un niveau d'indirection de plus. Donc deux solutions :
void init(AA** aa) { aa = malloc(sizeof(AA)); }
ou bien
AA* init(void) { return malloc(sizeof(AA)); }
si j'écris la ligne (2), tout va bien, si je remplace par la ligne (1) alors le prog crash en ligne (3).
Et le fait qu'il crashe en ligne 3 était dû au fait que aa valait NULL. Etant donné que aa est NULL, aa->nbr crash lamentablement.
Pierre Maurette
Le 23/03/05 22:58, dans <4241e669$0$5353$, « Pierre
[...]
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la variable aa et init doit modifier cette valeur :
[...] Ou alors:
AA* init(void){return (AA *) malloc(sizeof(AA));}
/* ..... */
aa = init();
Oui, mais toujours sans le cas (AA *). Je ne comprends pas... (fatigue ?)
-- Pierre
Le 23/03/05 22:58, dans <4241e669$0$5353$626a14ce@news.free.fr>, « Pierre
[...]
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen
de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la
variable aa et init doit modifier cette valeur :
[...]
Ou alors:
AA* init(void){return (AA *) malloc(sizeof(AA));}
/* ..... */
aa = init();
Oui, mais toujours sans le cas (AA *).
Je ne comprends pas... (fatigue ?)
Le 23/03/05 22:58, dans <4241e669$0$5353$, « Pierre
[...]
Tu passes à init la valeur de aa, donc NULL. Cette fonction n'a aucun moyen de retourner la nouvelle valeur de aa. Il faut donc passer l'adresse de la variable aa et init doit modifier cette valeur :
[...] Ou alors:
AA* init(void){return (AA *) malloc(sizeof(AA));}
/* ..... */
aa = init();
Oui, mais toujours sans le cas (AA *). Je ne comprends pas... (fatigue ?)
-- Pierre
Stephane Legras-Decussy
Eric Levenez a écrit dans le message : BE67A3C6.310DE%
void init(AA **aa)
arf.... merçi pour toutes les réponses...
comme quoi même avec quelques dizaines de milliers de ligne de C derrière soit, on peut quand même passer à coté...
je vous dis pas depuis combien de temps ça me bloquait... :-(
Eric Levenez <eric@levenez.com> a écrit dans le message :
BE67A3C6.310DE%eric@levenez.com...
void init(AA **aa)
arf.... merçi pour toutes les réponses...
comme quoi même avec quelques dizaines de milliers
de ligne de C derrière soit, on peut quand même passer
à coté...
je vous dis pas depuis combien de temps ça me bloquait...
:-(