passer une structure à une fonction ne fonctionne pas [dupliquer]

Aug 16 2020

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

1 Miket25 Aug 16 2020 at 07:56

La fonction dividemodifie 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é divideavec l'adresse de la structure d'origine

divide(&A);
2 Peter Aug 16 2020 at 08:05

Lorsque vous passez Aà divide, une copie de Aest créée. La modification de cette copie à l'intérieur dividen'a aucun effet sur la variable locale que Avous avez définie dans main. Pour remédier à cela, vous pouvez faire divideprendre 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 dividela signature « à: void divide(person *A)et dans la dernière ligne de cette fonction vous assing pas , Amais à tout ce qui Aest en montrant en utilisant l'opérateur de déréférencement: *A = half. Dans votre mainfonction vous passez ensuite l' adresse du Alieu de Alui - même pour divideutiliser l'adresse de l' opérateur: divide(&A).

EDIT: encore mieux, vous pouvez éviter de créer le temporaire halfen effectuant directement: A->age /= 2et A->wage /= 2A.xest le sucre syntaxique pour (*A).x.