Bonjour, j'ai le code suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
Species * CopySpecies(Species * s_)
{
  Species * s=CreateSpecies(s_->name,s_->M,s_->T,s_->LT,s_->HT);
  CopyViscosity(s_,s);
  return s;
}
où le prototype de la fonction CopyViscosity est le suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
void CopyViscosity(Viscosity *,Viscosity *);
Pourquoi est-ce que mon compilateur ne m'a pas donné un message d'erreur ? Pire, pourquoi n'y a-t-il pas de bug lors de l'exécution ? Y a-t-il un comportement indéterminé (ce que je pense fort) ?

Voici mes structures utilisées :

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
 
struct structspecies
{
  char * name; /* name */
  double M;    /* molar mass */
  double T;    /* threshold temperature */
  double * LT; /* 7 low temperature coefficients */
  double * HT; /* 7 high temperature coefficients */
  Atoms * atoms; /* atomic composition (C, H, O, N) of the species */
  Viscosity * visc; /* viscosity data */
};
 
typedef struct structspecies Species;
 
typedef struct
{
  double pot; /* Lennard-Jones potential parameter (the ratio epsilon_0/k_B)
                 (in K)
	       */
  double sigma; /* Lennard-Jones collision diameter (in Angstrom) */
  double sigma2; /* sigma*sigma */	       
  double Tc; /* critical temperature (in K) */
  double Pc; /* critical pressure (in atm) */
  double Vc; /* critical volume (in cm^3/(g*mol)) */
  double Zc; /* critical compressibility */
} Viscosity;
je compile avec les options d'Emmanuel :

ED_PARANOIA=-O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int \
-Werror-implicit-function-declaration -Wmain -Wparentheses \
-Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused \
-Wuninitialized -Wunknown-pragmas -Wfloat-equal -Wundef \
-Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings \
-Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes \
-Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn \
-Wformat -Wmissing-format-attribute -Wno-deprecated-declarations \
-Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long \
-Wunreachable-code
L'erreur que j'obtenais à la fin de mon programme, lors de la libération de toute la mémoire allouée, était celle-ci :

out(3093,0xa000d000) malloc: *** Deallocation of a pointer not malloced: 0x3098a0; This could be a double free(), or free() called with the middle of an allocated block; Try setting environment variable MallocHelp to see tools to help debug
ce qui se comprend bien vue ma faute de prototype... Mais pourquoi ai-je cette erreur sur mon Mac intel (gcc version 3.0) et pourquoi n'apparait-elle pas sur mon linux Suse pro 9.3 (gcc version 3.0) ?

Merci