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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager