Las funciones que realizan un manejo activo de la memoria del sistema requieren todas ellas para su correcto funcionamiento la inclusión, mediante la directiva del pre-pocesador #include del archivo de cabecera <stdlib.h>. Esto significa que todo programa debe tener esta biblioteca asignada, de otra forma no va a funcionar.</stdlib.h>
RESERVA DINAMICA DE MEMORIA
En C, la reserva dinámica de memoria se realiza mediante el uso de funciones, existen varias funciones de reserva de memoria, sin embargo, aquí solo explicaremos la reserva dinámica de memoria mediante la función malloc(). La función malloc() tiene la forma:
void *malloc(unsigned num_bytes);
Siendo num_bytes el número de bytes que se desean reservar. Para poder saber cuantos bytes se necesitan se utiliza la función sizeof.
La función malloc() devuelve un puntero al tipo de datos void (sin tipo). Dicho puntero puede ser asignado a una variable puntero de cualquier tipo base mediante una conversión forzada de tipo de datos (casts). Como por ejemplo:
int *a;
a=(int *)malloc(sizeof(int));//Y ahora podríamos realizar la siguiente asignación*a = 3;
La función malloc(), y en general, cualquier función de reserva dinámica de memoria, devuelve un puntero nulo (NULL) si la reserva de memoria no puede realizarse, generalmente por falta de memoria disponible. Por ello, antes de usar un puntero devuelto por la función malloc() o por cualquier otra función de reserva dinámica de memoria es imprescindible, con el fin de evitar posibles fallos en la ejecución del programa, comprobar que dicho puntero no es nulo (NULL). Veamos algunos ejemplos:
float *a;
a=(float *)malloc(sizeof(float));
if (a==NULL) exit(0); // Salimos del programa
unsignedlongint*b;
if ((b=(unsignedlongint)malloc(sizeof(unsignedlongint)))==NULL)
exit(0); // Salimos del programastruct ALFA{
unsigned a;
float b;
int *c;
}*d;
if ((d=(struct ALFA *)malloc(sizeof(struct ALFA)))==NULL)
exit(0); //Salimos del programa
LIBERACION DINAMICA DE MEMORIA
La memoria dinámica reservada es eliminada siempre al terminar la ejecución del programa por el propio sistema operativo. Sin embargo, durante la ejecución del programa puede ser interesante, e incluso necesario, proceder a liberar parte de la memoria reservada con anterioridad y que ya ha dejado de ser necesario tener reservada, además de que evitamos los memory leaks o el goteo de memoria. Esto puede realizarse mediante la función free(). La función free() tiene la forma:
voidfree(void *p);
Donde p es la variable de tipo puntero cuya zona de memoria asignada de forma dinámica queremos liberar. Veamos un ejemplo de liberación de memoria:
int *a;
if ((a=(int *)malloc(sizeof(int)))==NULL)
exit(0); // Salimos del programa
......
free(a);
Un aspecto a tener en cuenta es el hecho de que el puntero a liberar no debe apuntar a nulo (NULL), pues en tal caso se producirá un fallo en el programa. Es por ello que cobra aún más sentido la necesidad de comprobar al reservar memoria de forma dinámica que la reserva se ha realizado de forma correcta, tal y como se explico en el apartado anterior.