Estructura libre y el montón.

Si tenemos una estructura que tiene punteros a la memoria localizada y luego, si liberamos esa estructura, ¿también se libera la memoria a la que hace referencia esa estructura? ¿O tenemos que liberarlo manualmente? p.ej:

typedef struct{ FOMResult *fomResult; HOMResult *homResult; } MResult; 

donde FOMResult y HOMResult son ambas estructuras.

¿Es la memoria referenciada por esa estructura también liberada? ¿O tenemos que liberarlo manualmente?

El último.

Cada bloque de memoria asignado dinámicamente necesita una llamada separada a free() .

Tendrá que liberar memoria apuntada por fomResult y homResult antes de liberar su MResult , de lo contrario terminará con una pérdida de memoria.

Por supuesto, si tiene otro puntero a esos bloques de memoria, puede usarlos para liberar la memoria.

Es básicamente igual al número de malloc() s realizados para asignar la memoria. Si asigna memoria dinámicamente usando malloc() para ambos punteros de estructura fomResult y fomResult , debe usar dos funciones free() separadas para liberar memoria allí junto con MResult liberado.