2010-10-27 4 views
19

Valgrind signale l'erreur Invalid read of size 8 dans le code suivant.Lecture non valide de la taille 8 - Valgrind + C

J'ai un tableau déclaré comme,

struct symbol *st[PARSER_HASH_SIZE]; 

Quand mon programme est initialisé, tous les éléments de ce tableau sont initailzied comme 0.

memset(&st[0], 0, sizeof(st)); 

Mon programme crée des instances de struct symbol et inserts dans le tableau ci-dessus en fonction de la valeur de hachage. Donc, peu d'éléments dans ce tableau seront NULL et d'autres auront une valeur valide.

Le code suivant tente de supprimer les éléments attribués et valgrind se plaint à 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); 
    } 
} 

Je suis en train de comprendre la raison de cette erreur.

Toute aide serait géniale!

Répondre

40

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; 
} 
3

aussi son pas clair si vous tableau est destiné à contenir des struct ou des pointeurs vers structs

struct symbol *st[PARSER_HASH_SIZE]; 

dit son un tableau de pointeurs vers les structures. Mais alors vous dites

"Lorsque mon programme est initialisé, tous les éléments de ce tableau sont initalisés à 0."

memset(&st[0], 0, sizeof(st)); 

Ce traite les entrées comme struct

pour effacer le tableau ne

for (int i = 0; i < PARSER_HASH_SIZE; i++) 
{ 
    st[i] = 0; 
} 
+0

Il est destiné à contenir des pointeurs vers structs. Pouvez-vous me dire comment l'initialiser correctement? –