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