Bonjour,

J'ai un petit problème avec Valgrind qui me signale un "Conditional jump or move depends on uninitialised value(s)" lors de l'affichage d'une liste chaînée.

Les structures :
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
 
typedef void Objet;
 
/* le type Element (élément de la liste) */
struct s_Element {
  Objet* reference; /* référence un objet */
  struct s_Element* suivant; /* élément suivant de la liste */
  struct s_Element* precedent; /* élément suivant de la liste */
};
typedef struct s_Element Element;
 
/* le type Liste */
struct s_Liste {
  Element* premier; /* premier élément de la liste */
  Element* dernier; /* dernier élément de la liste */
  int nbElt; /* nombre d'élements dans la liste */
  int type; /* type de liste */
  char* (*toString) (Objet*);
  int (*comparer) (Objet*, Objet*);
};
typedef struct s_Liste Liste;
La portion de code incriminée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
void afficherListe(Liste* l) {
  Element* e = l->premier;
 
  printf("%d elements : ", nbEltListe(l));
 
  while(e != NULL) {
    printf("%s ", l->toString(e->reference));
    e = e->suivant;
  }
}
Le programme compile bien en -Wall -ansi et affiche ce qui est attendu :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
5 elements : pladamousse kikoo test lol pasteque
Or Valgrind indique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
 
==10534== Conditional jump or move depends on uninitialised value(s)
==10534==    at 0x8048B16: afficherListe (Liste.c:146)
==10534==    by 0x8048C51: main (main.c:38)
C'est-à-dire que mon pointeur sur Element e ne serait pas initialisé, or l->premier l'est à l'initialisation de la liste (=NULL), et plus encore il l'est car il m'affiche ma liste correctement...
Je me demande donc si ce n'est pas simplement Valgrind qui me sort une fausse erreur. Et comment faire pour avoir un memcheck "propre" !

Merci à vous !