2010-10-27 11 views
19

Valgrind zgłasza błąd Invalid read of size 8 w poniższym kodzie.Błąd odczytu wielkości 8 - Valgrind + C

Mam tablicę zadeklarowane jak,

struct symbol *st[PARSER_HASH_SIZE]; 

Gdy mój program jest inicjowany, wszystkie elementy tej tablicy są initailzied jako 0.

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

Mój program tworzy instancje struct symbol i wkładek do powyższej tablicy w zależności od wartości skrótu. Tak mało elementów w tej tablicy będzie NULL, a inne będą poprawną wartością.

Poniższy kod próbuje usunąć przydzielonych przedmioty i valgrind narzeka na linii, 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); 
    } 
} 

Próbuję zrozumieć przyczynę tego błędu.

Każda pomoc będzie świetna!

Odpowiedz

40

Problem polega na tym, że uwalniasz sym, a następnie próbujesz uzyskać dostęp do wartości z (teraz uwolnionych) danych: sym->next.

Prawdopodobnie chcesz coś takiego dla pętli wewnętrznej:

struct symbol *next_sym = NULL; 

for(sym = st[i]; sym != NULL;) { 
    next_sym = sym->next; 
    free(sym); 
    sym = next_sym; 
} 
3

też jej nie jasne, czy tablica jest oznaczało zawierać konstrukcjom lub wskaźniki do kodowanym

struct symbol *st[PARSER_HASH_SIZE]; 

mówi swoją tablicę wskaźniki do struktur. Ale potem mówisz, że

"Kiedy mój program jest zainicjowany, wszystkie elementy w tej tablicy są initailzied jako 0."

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

To jest traktowanie wpisy jak kodowanym

aby wyczyścić tablicę nie

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

To ma zawierać odnośniki do elemencie. Czy możesz mi powiedzieć, jak zainicjować go poprawnie? –