Forma óptima de liberar () un array 2D malloc'ed en C

Suponiendo que tengo una matriz bidimensional que fue creada con algo como esto,

char **foo = (char **) malloc(height * sizeof(char *));
for(i = 0; i <= height; i++) 
    foo[i] = (char *) malloc (width * sizeof(char *));

En primer lugar, ¿es esta incluso la forma correcta de crear una matriz como esta? La captura aquí es, 'altura' y 'ancho' es algo que se establece durante el tiempo de ejecución.

Esto parece funcionar, pero es la mejor estrategia para liberar esta matriz 2d. libre (funge) suena mal. Pasando por algunas otras publicaciones aquí, supongo que tendré librecada fila uno por uno?

Probé algo como esto,

for (height = 0; height < ip_ptr->funge_height; height++) {
    free(funge[height]);
} 
free(funge)

Esto, sin embargo, me da una doble excepción de puntero libre. ¿Significa esto que no tengo que manejar este pedazo de memoria? Tenía la impresión de que, para cada memoria malloc'ed, deberíamos llamar gratis ().

Respuestas a la pregunta(4)

Su respuesta a la pregunta