2010-10-27 10 views
19

Valgrind informa el error Invalid read of size 8 en el siguiente código.Lectura no válida del tamaño 8 - Valgrind + C

tengo una matriz declarada como,

struct symbol *st[PARSER_HASH_SIZE]; 

Cuando se inicializa mi programa, todos los elementos de esta matriz se initailzied como 0.

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

Mi programa crea instancias de struct symbol y los insertos en la matriz anterior dependiendo del valor hash. Muy pocos de los elementos de esta matriz serán NULL y otros tendrán un valor válido.

El siguiente código intenta eliminar los temas asignados y valgrind se queja en la línea, 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); 
    } 
} 

Estoy tratando de comprender la razón de este error.

¡Cualquier ayuda sería genial!

Respuesta

40

El problema es que está liberando el sym, y luego intenta acceder a un valor de los datos (ahora liberados): sym->next.

es probable que desee algo como esto para el bucle interno:

struct symbol *next_sym = NULL; 

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

también no está claro si se refería matriz para contener estructuras o punteros a estructuras

struct symbol *st[PARSER_HASH_SIZE]; 

dice que su un conjunto de punteros a las estructuras. Pero luego dices

"Cuando mi programa se inicializa, todos los elementos de este conjunto se consideran cero".

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

Este es el tratamiento de las entradas como estructuras

para borrar la matriz do

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

Está destinado a contener punteros a estructuras. ¿Puedes decirme cómo inicializarlo correctamente? –

Cuestiones relacionadas