Bonjour, mon code a une erreur que j'arrive à réparer mais en soit je ne la comprends pas. Pouvez-vous me l'expliquer s'il vous plait ? Je vous envoie d'abord mon code qui marche (pour que vous puissiez le compiler si vous avez envie) et ensuite je vous explique le problème

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
 
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
 
typedef struct t_tab
{
    int dim; // dimension du tableau
    double * data;
} Tableau;
 
Tableau * alloc_Tableau(unsigned int dim_,double val)
{
// alloue un espace memoire pour creer le tableau t et l'initialise a val
    assert(dim_>=0);
 
    Tableau * t=malloc(sizeof(Tableau));
    assert(t!=NULL);
 
    if(dim_==0) // si dim_==0 on considere que le tableau est vide
    {
	t->dim=0;
	t->data=NULL;
    }
    else
    {
	t->dim=dim_;
	t->data=malloc(dim_*sizeof(double));
	assert(t->data!=NULL);
	int i;
	for(i=0;i<dim_;i++)
	    t->data[i]=val;
    }
    return t;
}
 
void free_Tableau(Tableau * t)
{
    t->dim=0;
// libere la memoire
    if(t->data!=NULL)
    {
	free(t->data);
	t->data=NULL;
    }
    free(t);
    t=NULL;
    return ;
}
 
Tableau * Tableau_vide(void)
{
    Tableau * t=malloc(sizeof(Tableau));
    t->dim=0;
    t->data=NULL;
    return t;
}
 
void affiche_Tableau(Tableau * t)
{
    if(t->data==NULL)
	printf("\nTableau vide\n");
    else
    {
	int i;
	for(i=0;i<t->dim;i++)
	    printf("%7.10g\t",t->data[i]);
	printf("\n");
    }
    printf("\n");
    return;
}
 
void copie_Tableau(Tableau * t,Tableau * out)
{
// copie le tableau *t dans le tableau *out
 
    if(t->data!=out->data) // permet de faire copie_Tableau(t,t)
    {
	free_Tableau(out);
 
	if(t->dim==0) // tableau vide
	    out=Tableau_vide();
	else
	{
	    out=alloc_Tableau(t->dim,0.0);
	    int i;
	    for(i=0;i<out->dim;++i)
		out->data[i]=t->data[i];
	}
    }
    return;
}
 
void f(Tableau * t1,Tableau * t2)
{
// Cree deux tableau t1 et t2
 
    free_Tableau(t1);
    t1=alloc_Tableau(3,2);
 
    free_Tableau(t2);
    t2=alloc_Tableau(4,1);
 
   return;
}
 
int main()
{
    Tableau * t1=Tableau_vide();
    Tableau * t2=Tableau_vide();
 
    f(t1,t2);
 
    printf("affichage de t1\n");
    affiche_Tableau(t1);
 
    printf("affichage de t2\n");
    affiche_Tableau(t2);
 
    free_Tableau(t1);
    free_Tableau(t2);
 
    return 0;
}
Les sorties sont correctes :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
affichage de t1
      2       2       2
 
affichage de t2
      1       1       1       1
Maintenant, je modifie la fonction f de la manière suivante (et là il y a une erreur) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
void f(Tableau * t1,Tableau * t2)
{
// Cree deux tableau t1 et t2
 
    free_Tableau(t1);
    free_Tableau(t2);
 
    t1=alloc_Tableau(3,2);
    t2=alloc_Tableau(4,1);
 
   return;
}
Donc en soit je n'ai fait que déplacer le free_Tableau(t2); et la sortie est :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
affichage de t1
 
 
affichage de t2
      2       2       2
 
Erreur de segmentation
donc pour l'affichage de t2 il m'affiche t1, pour l'affichage de t1 il ne m'affiche rien du tout (même pas Tableau vide) et j'ai une erreur de segmentation.

Savez-vous pourquoi s'il vous plait ?

Merci d'avance;