Otra forma de dar valor a un puntero es asignarle memoria dinámica mediante una función de asignación de memoria. Recordar que al declarar un puntero simplemente se está reservando memoria para almacenar una dirección de memoria, no se le está asignando una dirección correcta, esto habrá que hacerlo posteriormente, como ya hemos visto en ejemplos anteriores, y veremos también en esta sección.
En numerosas ocasiones no se conoce a priori la memoria que se necesita, por lo que no se puede reservar ésta al declarar variables, habrá que hacerlo durante la ejecución del programa, es decir, de manera dinámica.
Las funciones de asignación de memoria reservan memoria de manera dinámica, devolviendo la dirección del primer byte de la zona reservada. Las funciones más habituales son calloc y malloc, definidas en el fichero alloc.h o bien en stdlib.h. Su sintaxis es la siguiente:
malloc(size_t size). Donde el argumento es el número de bytes que se quieren reservar.
calloc(size_t n_items, size). Esta función reserva n_items bloques de size bytes cada uno, es decir, n_bytes*size bytes de memoria.
Ejemplo_punt_4. Ejemplo de uso de malloc que reserva memoria para almacenar n enteros, donde n es un valor introducido por teclado. En el programa sólo mostramos la parte de reserva de memoria. La asignación tendrá más sentido cuando usemos estructuras de datos como vectores, arrays o estructuras, tipos de datos que veremos más adelante.
#include <stdio.h>
int main ()
{
int *x, num_dat;
printf ("Cuantos valores quieres almacenar:");
scanf ("%d", &num_dat);
// Si malloc falla devuelve el valor NULL,
// antes de continuar comprobamos este posible error
if ( (x=(int*)malloc(num_dat * sizeof(int))) == NULL)
{
printf("ERROR al reservar memoria\n");
return 1;
}
return 0;
}
La memoria no usada se puede liberar con la función free(puntero_a_memoria). Para más información sobre estas funciones, se puede consultar el manual de UNIX o bibliografía sobre el tema.