la tabella hash che gestisce le collisioni mediante liste è così definita:
typedef struct {
list_t ** table;
unsigned int size;
int (* compare) (void *, void *);
void * (* copyk) (void *);
void * (* copyp) (void *);
unsigned int (* hash) (void *,unsigned int);
} hashTable_t;

dove lista è:
typedef struct {
elem_t * head;
int (* compare) (void *, void *);
void * (* copyk) (void *);
void * (* copyp) (void *);
} list_t;

e il generico elemento definito come chiave, payload e puntatore al succ.
Mi viene quindi chiesto di implementare la funzione:
void free_hashTable (hashTable_t ** pt);
Innanzitutto mi chiedo: perchè doppio puntatore?
Seconda cosa ho già implementato la free_List e ha superato il test quindi posso utilizzarla. Questa è la mia implementazione non corretta della free_hashTable:

void free_hashTable (hashTable_t ** pt){
int i;
list_t ** tmp = (*pt)->table;
if(!pt) errno=EINVAL;
else{
for(i=0; i< (*pt)->size; i++){
free_List(tmp[i]);
}
free(*((*pt)->table));
free(*pt);
(*pt)=NULL;
}
}

il punto è che anche la free_List prende in ingresso un doppio puntatore però mentre per le liste mi lavora qui mi da segmentation fault al primo accesso.
il punto è:
come faccio a passare alla free_List di volta in volta la lista di posizione "i" all'interno della tabella hash?? perchè in questo modo mi da errore. e poi temo che la dichiarazione di tmp che faccio è una cazzata!!

confido nel vostro aiuto