Memoria dinámica
En C podemos reservar memoria de forma dinámica en tiempo de ejecución.
En la práctica hay dos tipos de memoria: memoria estática que gestiona el compilador y memoria dinámica que gestiona el programador.
Cuando se definen variables el compilador les asigna el espacio necesario dependiendo del tipo de la variable.
Dependiendo del ámbito donde se defina la variable el compilador asigna memoria en la pila (stack) para variables locales y parámetros de funciones.
Para variables globales el compilador asigna la memoria de las variable en un segmento de datos a parte.
El programador puede reservar memoria de forma dinámica en tiempo de ejecución con la función malloc a la cual se le pasa el número de bytes de la memoria a reservar.
La memoria reservada se crea en un segmento de datos llamado HEAP usado únicamente para memoria dinámica.
La función malloc retorna un puntero a la zona de memoria reservada.
Pej.
int *p = (int *)malloc(200);
La función malloc reserva 200 bytes de memoria y retorna un puntero sin tipo a la zona reservada.
Se hace un casting explícito para indicar que en la zona de memoria hay enteros.
El puntero p apunta a la zona reservada con malloc.
La asignación dinámica de memoria nos permitirá gestionar cantidades de datos en el momento que se ejecuta el programa y no en el momento de compilación.
En el ejemplo anterior si el tamaño de un entero es de 2 bytes, se reservará memoria para 100 enteros.
El caso anterior también se puede definir de la forma
int *p = (int *)malloc(100*sizeof(int));
Hay que indicar que la memoria reservada con malloc la controla el programador, no el compilador, y es él el que debe liberarla cuando no la use.
Se debe usar la función free para liberar la memoria asignada dinámicamente.
Pej
free(p);