Copie *totale* de structures
Bonjour.
Je n'arrive pas à faire une copie *complète* de structure. Les cas rencontrés dans
les FAQs que j'ai lues ne traitaient que du cas simple d'une copie sans "profondeur"
et sans pointeur.
Lorsque j'utilise "memcopy" les résultats sont identiques.
Faut-il passer par "malloc" ?
Je vous fournis un code (artificiel, juste pour illustrer mon problème).
Je crée donc une voiture "car1" qui me sert de modèle pour créer une
autre, "car2". Dans mon cas réel j'ai beaucoup plus de champs dans
mes structures.
Un point à noter : dans la structure "Car" je veux un *pointeur*
sur la structure "Engine", parce qu'il pourra se faire que la voiture
n'aie pas de moteur (donc p_engine = NULL).
En dessous du code figure ce que j'obtiens dans ma console.
Je débute en C. Merci.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
#inclut <stdio.h>
struct Engine {
int displacement;
};
struct Car {
int mass;
struct Engine * p_engine;
};
void copy_engine(struct Engine * p_engine_src, struct Engine * p_engine_dest) {
p_engine_dest->displacement = p_engine_src->displacement;
return;
}
void copy_car(struct Car * p_car_src, struct Car * p_car_dest) {
p_car_dest->mass = p_car_src->mass;
copy_engine(p_car_src->p_engine, p_car_dest->p_engine);
return;
}
void build_engine(struct Engine * p_engine) {
p_engine->displacement = 1400;
return;
}
void build_car(struct Car * p_car) {
struct Engine engine;
build_engine(&engine);
p_car->mass = 1200;
return;
}
void print_car(struct Car * p_car) {
printf("car:%p\n", (void *) p_car);
printf(" car.mass:%d\n", p_car->mass);
printf(" car.p_engine:%p\n", (void *) p_car->p_engine);
printf(" car.p_engine.displacement:%d\n", p_car->p_engine->displacement);
return;
}
int main (int argc, char *argv[]) {
struct Car car1;
struct Car car2;
build_car(&car1);
copy_car(&car1, &car2);
print_car(&car1);
print_car(&car2);
return 0;
} |
Code:
1 2 3 4 5 6 7 8 9
|
car:0xbff75a3c
car.mass:1200
car.p_engine:0xb7dcdc8c
car.p_engine.displacement:18589
car:0xbff75a34
car.mass:1200
car.p_engine:0xbff75a58
car.p_engine.displacement:18589 |