Je veux attribuer la structure a à la structure b. L'impression de l'adresse et des valeurs du tableau avant et après l'appel de fonction montre que pendant l'appel de fonction, l'affectation fonctionne et les deux pointeurs pointent vers la même adresse struct. Cependant, après le retour de la fonction, les modifications sont annulées. Pourquoi?

typedef struct arrayA {
    int a[3]; 
}arrayA; 

void f(arrayA *a, arrayA *b){
    a = b; 
    printf("address of a: %p\n", a); 
    printf("address of b: %p\n", b); 
}

int main(int argc, char *argv[]) {
    printf("------------ Array assignment test -----------------\n"); 
    arrayA a = { { 0, 0, 0} }; 
    arrayA b = { { 1, 1, 1} }; 
    printf("address of a: %p\n", &a); 
    printf("address of b: %p\n", &b); 
    printf("a[0] : %d a[1] : %d\n", a.a[0], a.a[1]); 
    f(&a, &b); 
    printf("a[0] : %d a[1] : %d\n", a.a[0], a.a[1]); 
    printf("address of a: %p\n", &a); 
    printf("address of b: %p\n", &b); 
    printf("----------------------------------------------------\n"); 

    return 0;
}

Impressions

 ------------ Array assignment test -----------------
address of a: 0x7ffd3fc17b80
address of b: 0x7ffd3fc17b90
a[0] : 0 a[1] : 0
address of a: 0x7ffd3fc17b90
address of b: 0x7ffd3fc17b90
a[0] : 0 a[1] : 0
address of a: 0x7ffd3fc17b80
address of b: 0x7ffd3fc17b90
----------------------------------------------------
0
SebNag 17 janv. 2017 à 01:08

2 réponses

Meilleure réponse

Vous passez les pointeurs par valeur et vous vous attendez à ce qu'ils soient modifiés. Ils seront modifiés dans la fonction car il y a une copie du pointeur (adresse) qui est rendu local à la fonction. Lorsque la fonction retourne, les originaux restent inchangés. (Vous pouvez essayer d'imprimer l'adresse des variables locales dans la fonction pour mieux comprendre.)

Si vous souhaitez modifier les structures, vous souhaiterez déréférencer les pointeurs:

void f(arrayA *a, arrayA *b){
    *a = *b; 
    printf("address of a: %p\n", a); 
    printf("address of b: %p\n", b); 
}

Si vous souhaitez modifier les pointeurs eux-mêmes, vous aurez besoin d'une indirection supplémentaire:

void f(arrayA **a, arrayA **b){ // Note the ** here
    *a = *b; 
    printf("address of a: %p\n", a); 
    printf("address of b: %p\n", b); 
}
2
user1952500 16 janv. 2017 à 22:16

Cependant, après le retour de la fonction, les modifications sont annulées. Pourquoi?

Votre fonction f() change vraiment simplement le pointeur à l'intérieur, et ces changements de pointeur ne sont pas réservés après la fonction.

Vous pouvez copier la structure en passant par le pointeur:

void f(arrayA *a, arrayA *b){
    *a = *b; 
}

Cela garantira que vous pouvez copier la structure dans main() via

f(&a, &b); 

Comme tout ce dont vous avez besoin est de copier la structure, il n'est pas du tout nécessaire d'imprimer les adresses. Au cas où vous auriez besoin de déboguer l'adresse, vous devez convertir en (void *) pour éviter tous les avertissements avec printf("%p")

1
artm 16 janv. 2017 à 22:15