¡Buenas!
El problema esta en que a la funcion que libera los datos le pasas un puntero a Tabla. A efetos practicos, ese puntero es como si fuese una variable local, por lo tanto todos los cambios que realices sobre el puntero (no sobre el objeto al que apunta), solo afectaran a esa "variable local" y no al objeto al que apunta. Es decir, si haces que ese puntero se NULL, no haras que un puntero exterior que hubieses puesto en la lista de parametros sea NULL. Recuerda el problema del intercambio:
void intercambio(int *a,int *b) //para poder modificar enteros exteriores usamos punteros
{
int aux;
aux = *a;
*a = *b;
*b = aux;
}
Lo mismo ocurre con los punteros, si quieres modificar un puntero exterior a la funcion, deberas pasar un puntero a ese puntero, y luegoya trabajar con el, asi que suponiendo que el reto de tu codigo este bien, y que a la funcion liberar le pases un puntero, tendras que cambiar la llamada de la funcion para pasar un puntero a ese puntero y cambiar el codigo dentro de la funcion asi:
bool tablaLibera( Tabla **tablaA ){
if(*tablaA != NULL){
free((*tablaA)->claves);
(*tablaA)->claves=NULL;
free((*tablaA)->valores);
(*tablaA)->valores=NULL;
free((*tablaA)); //Ahora si que estas modificando un puntero exterior a la funcion
(*tablaA)=NULL;//Ahora si que estas modificando un puntero exterior a la funcion
return true;
}else{
return false;
}
}
Como ves, el funcionamiento de las dos funciones es similar. En una desreferenciamos un entero, y en la segunda desreferenciamos un puntero a un puntero a Tabla, asi en la primera modificamos un entero exterior a la funcion, y en la segunda modificamos un puntero a Tabla exterior a la funcion.
¡Saludos!