164 votes

Affecter une structure à une autre dans C

Peut-on assigner une instance d'une structure à une autre, comme ceci :

struct Test t1;
struct Test t2;
t2 = t1;

J'ai vu que cela fonctionne pour des structures simples, mais est-ce que cela fonctionne pour des structures complexes ?
Comment le compilateur sait-il copier les éléments de données en fonction de leur type, c'est-à-dire en faisant la différence entre une int et de la ficelle ?

0voto

Dean P Points 108

Oui, vous pouvez affecter une instance d'une structure à une autre en utilisant une simple instruction d'affectation.

  • Dans le cas des membres d'une structure ne contenant pas de pointeur ou ne contenant pas de pointeur, l'affectation signifie la copie.

  • Dans le cas des membres d'une structure pointeur, l'affectation signifie que le pointeur sera pointera vers la même adresse que l'autre pointeur.

Voyons cela de plus près :

#include <stdio.h>

struct Test{
    int foo;
    char *bar;
};

int main(){
    struct Test t1;
    struct Test t2;
    t1.foo = 1;
    t1.bar = malloc(100 * sizeof(char));
    strcpy(t1.bar, "t1 bar value");
    t2.foo = 2;
    t2.bar = malloc(100 * sizeof(char));
    strcpy(t2.bar, "t2 bar value");
    printf("t2 foo and bar before copy: %d %s\n", t2.foo, t2.bar);
    t2 = t1;// <---- ASSIGNMENT
    printf("t2 foo and bar after copy: %d %s\n", t2.foo, t2.bar);
    //The following 3 lines of code demonstrate that foo is deep copied and bar is shallow copied
    strcpy(t1.bar, "t1 bar value changed");
    t1.foo = 3;
    printf("t2 foo and bar after t1 is altered: %d %s\n", t2.foo, t2.bar);
    return 0;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X