Reservar memoria dinámica para un vector en C
Puesto que estamos hablando bastante de C en el curso de programación de videojuegos con SDL, voy a publicar una serie de pequeños apuntes sobre programación en C que seguro que os son de utilidad. No van a constituir un curso como tal pero serán una serie de entradas relacionadas sobre este tema.
Memoria dinámica
Cuando trabajamos con variables, el compilador genera código máquina que se encarga de reservar memoria al comienzo de la ejecución y de liberarla al finalizar la misma. Cuando necesitamos trabajar con una serie de datos que no sabemos cuánto van a ocupar, por ejemplo con una estructura que variará con el número de jugadores de nuestro videojuego, no podemos reservar un vector (array o arreglo) para un número indeterminado.
Deberemos declarar un puntero y sobre dicho puntero, pedirle al sistema memoria suficiente conforme a nuestras necesidades. El sistema nos devolverá una dirección de memoria (que se almacenará en el puntero) y junto a la cuál (de forma correlativa) se encontrarán las demás posiciones del vector con el que vamos a trabajar.
malloc
La función que se encarga de efectuar ese trabajo es malloc (del inglés, reserva de memoria, memory allocation). Tras reservar memoria, deberemos hacer uso de free para liberarla cuando no la necesitemos más. Veamos qué parámetros maneja:
Entrada
- tamaño: del tipo size_t, es decir, número de bytes que queremos reservar. Será número de elementos del vector multiplicado por el tamaño del tipo de dato (lo obtenemos con sizeof).
Salida
- Dirección de memoria inicial del vector que se almacenará en un puntero. Es del tipo void* por lo que deberemos hacerle una conversión explícita o casting al tipo que queramos. Será NULL si ha habido problemas ejecutando malloc.
Ejemplo
#include <stdio.h> #include <stdlib.h> int main () { int numeroElementos; int* vector; printf ("¿Cuántos elementos quieres? "); scanf ("%d", &numeroElementos); vector = (int*)malloc(numeroElementos*sizeof(int)); if (vector==NULL) { perror("Problemas reservando memoria"); exit (1); } // trabajamos con el vector // lo liberamos free (vector); return 0; }