Ver Mensaje Individual
  #2 (permalink)  
Antiguo 03/06/2015, 14:00
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Liberar array reservado con malloc

Código C:
Ver original
  1. for (i=0; i<nEmpleados; i++) {
  2.         free(&regEmp[i]);
  3.     }

El bucle anterior sobra. Cuando hiciste la reserva de memoria, únicamente usaste un malloc, luego el bloque de memoria se ha de liberar únicamente con un free.

Por otro lado, "free(regEmp)" SI que libera la memoria. Liberar la memoria únicamente sirve para decirle al Sistema Operativo que esa región de memoria puede ser utilizada por quien la pida... liberar la memoria no implica sobreescribir lo que ya está almacenado en la misma. Lo que sucede es que la siguiente instrucción "regEmp = NULL;" implica únicamente un cambio local, por lo que el puntero registro no se entera.

Dicho de otra forma: regEmp es un puntero, sí, pero también es una variable local de funcion. Todos los cambios que realices en la memoria apuntada se verán reflejados fuera de la función... pero si haces que regEmp apunte a otra región de memoria, entonces ese cambio es local.

Si quieres que registro acabe apuntando a NULL necesitas usar un puntero doble tal que:

Código C:
Ver original
  1. funcion(&registros, numRegistros);
  2.  
  3. // Nota que nEmpleados no es necesaria en la función
  4. funcion(tipoEmpleado **regEmp, int nEmpleados) {
  5.     //Libero array
  6.     free(&regEmp);
  7.     *regEmp = NULL;
  8. }

Un saludo