Categorías: Tutoriales

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;
}
F. Javier Carazo Gil

Cofundador de CODECTION, empresa especializada en WordPress, autor de un libro sobre WordPress (el primero en español) y multitud de artículos (en medios físicos y virtuales) sobre el tema. Participa en la comunidad WordPress de forma activa siendo parte del equipo organizador de la WordPress Meetup de Córdoba, dando charlas en diferentes WordCamp y siendo autor y coautor de multitud de plugins libres y premium para WordPress de gran éxito.

Ver comentarios

  • undefined variable 'buffer' o algo asi, hace un rato que no compilo en C.

    Pero excelente apunte hojala sigas con estas notas

  • @Javier pineda: Gracias por comentarme la errata, ya está solucionado.

    @DgMvEcuador: Lo seguirás recordando con las próximas entregas de SDL y alguna otra como esta que se me "escape" ;)

  • Muy buen tip, hacia tiempo buscaba una manera de emular los objectos mutables de lenguajes como java en C. Gracias.

  • Muchas gracias por tu código, me está sirviendo de mucho, pero tengo una duda, ¿para hacer una matriz de memoria dinámica como sería?Tenemos el tamaño de cada posición de la matriz, pero no el número de posiciones hasta que leamos por teclado.¿Qué debemos hacer?

    Es decir, matriz[x][5]
    x=número que leeremos por teclado

    Un saludo y muchas gracias

Entradas recientes

DeepSeek

2 días hace

Contacto

2 semanas hace

Smart-tv mute

2 semanas hace

STEAM OS

3 semanas hace

2025

4 semanas hace

El podcast de Linux Hispano – #072 – El hardware libre debe consolidarse como el software libre

https://www.youtube.com/embed/z-xGk9c_eOw Guionista y locutor: Manuel Ignacio López Quintero.Fecha de publicación: 31 de diciembre de 2024.

1 mes hace