passer une structure à une fonction ne fonctionne pas [dupliquer]
Dans le code ci-dessous, j'ai créé une fonction en dehors de main pour diviser l'int à l'intérieur d'une structure en deux.
Après cela, je veux imprimer la nouvelle valeur. Cependant, la valeur d'impression est toujours l'ancienne.
Je pense que mes connaissances fondamentales de la structure et des pointeurs ne sont pas assez bonnes.
Est-ce que quelqu'un peut m'aider avec ça? Merci beaucoup!!!
typedef struct{
int age;
int wage;
}person;
void divide(person A)
{
person half;
half.age = A.age / 2;
half.wage = A.wage / 2;
A = half;
}
int main(void)
{
person A;
A.age = 30;
A.wage = 35000;
divide(A);
printf("%i\n", A.age);
}
Réponses
La fonction divide
modifie une copie de cette structure car les structures sont passées par valeur. Vous devrez passer le pointeur vers la structure afin que la fonction puisse modifier l'original.
void divide(person* A)
{
person half;
half.age = A->age / 2;
half.wage = A->wage / 2;
*A = half;
}
Appelé divide
avec l'adresse de la structure d'origine
divide(&A);
Lorsque vous passez A
à divide
, une copie de A
est créée. La modification de cette copie à l'intérieur divide
n'a aucun effet sur la variable locale que A
vous avez définie dans main
. Pour remédier à cela, vous pouvez faire divide
prendre un pointeur vers person
. Un pointeur représente effectivement une adresse en mémoire de telle sorte que vous pouvez l'utiliser pour accéder par exemple à des variables locales définies dans d'autres fonctions qui autrement ne seraient pas accessibles (recherchez les cadres de pile si vous voulez comprendre pourquoi).
Donc , en pratique , vous changez divide
la signature « à: void divide(person *A)
et dans la dernière ligne de cette fonction vous assing pas , A
mais à tout ce qui A
est en montrant en utilisant l'opérateur de déréférencement: *A = half
. Dans votre main
fonction vous passez ensuite l' adresse du A
lieu de A
lui - même pour divide
utiliser l'adresse de l' opérateur: divide(&A)
.
EDIT: encore mieux, vous pouvez éviter de créer le temporaire half
en effectuant directement: A->age /= 2
et A->wage /= 2
où A.x
est le sucre syntaxique pour (*A).x
.