Valgrind signale une erreur Invalid read of size 8
dans le code suivant.
J'ai un tableau déclaré comme,
struct symbol *st[PARSER_HASH_SIZE];
Lorsque mon programme est initialisé, tous les éléments de ce tableau sont initialisés à 0.
memset(&st[0], 0, sizeof(st));
Mon programme crée des instances de struct symbol
et s'insère dans le tableau ci-dessus en fonction de la valeur de hachage. Ainsi, peu d'éléments de ce tableau seront NULL et d'autres auront une valeur valide.
Le code suivant essaie de supprimer les éléments alloués et valgrind se plaint sur la ligne, sym = st[i]; sym != NULL; sym = sym->next
struct symbol *sym = NULL;
/* cleaning the symbol table entries */
for(i = 0; i < PARSER_HASH_SIZE; i++) {
for(sym = st[i]; sym != NULL; sym = sym->next) { /* <-- Valgrind complains here */
free(sym);
}
}
J'essaie de comprendre la raison de cette erreur.
Toute aide est la bienvenue!
Le problème est que vous libérez le sym
, puis essayez d'accéder à une valeur à partir des données (maintenant libérées): sym->next
.
Vous voulez probablement quelque chose comme ça pour la boucle intérieure:
struct symbol *next_sym = NULL;
for(sym = st[i]; sym != NULL; ) {
next_sym = sym->next;
free(sym);
sym = next_sym;
}
il est également difficile de savoir si votre tableau est destiné à contenir des structures ou des pointeurs vers des structures
struct symbol *st[PARSER_HASH_SIZE];
dit que c'est un tableau de pointeurs vers des structures. Mais tu dis
"Lorsque mon programme est initialisé, tous les éléments de ce tableau sont initialisés à 0."
memset(&st[0], 0, sizeof(st));
Ceci traite les entrées comme des structures
pour effacer le tableau faire
for (int i = 0; i < PARSER_HASH_SIZE; i++)
{
st[i] = 0;
}