laisse supposer que vous attribuez une valeur de NULL
à un avant d'appeler la fonction f1
.Maintenant la façon dont f1 est définie prend son argument (pointeur vers un int
) par valeur. C'est b
sera une autre variable de type int *
qui sera un copie de a
. Donc, b
aura également une valeur de NULL
. Maintenant dans f1
vous modifiez la valeur par b
en lui affectant l'adresse de mémoire allouée dynamiquement en utilisant malloc
. Disons que l'adresse mémoire est 0x123
. À la suite de cette affectation, b
a changé sa valeur de NULL
à 0x123
mais a
(dans main
) continue à contenir NULL
, car le changement b ne changera pas a
, car ils sont deux variables distinctes. À la suite de cela, lorsque vous revenez de la fonction f1
un restera inchangé.
Il existe 2 façons de résoudre ce problème. Un, vous pouvez rendre la fonction f1
retourner la valeur de la b
changé puis l'assigner à un main
et deux, vous pouvez passer l'une par adresse afin que toutes les modifications apportées dans f1
affecteront un main
aussi.
// f1 now returns the value of b.
int* f1() {
int *b = malloc(sizeof(int));
*b = 5;
return b;
}
int main() {
int *a = NULL;
a = f1(); // assign the return value of f1 to a.
printf("%d\n", *a); // prints 5...not its *a not just a.
return 0;
}
.
// f1 now takes the address of a.
void f1(int **b) {
*b = malloc(sizeof(int)); // you are actually altering a indirectly.
**b = 5;
}
int main() {
int *a = NULL;
f1(&a); // now pass the address of a to f1.
printf("%d\n", *a); // prints 5...not its *a not just a.
return 0;
}
Ceci est de nouveau passé en valeur. Passer l'adresse d'une valeur par. ** Il n'y a pas de laissez-passer par référence en C ** – raj
Assez juste. Mise à jour pour être plus précis dans C. – Dusty