Asignación dinámica de memoria #16

Capítulo 16: Asignación dinámica de memoria

Lo prometido es deuda, ya estoy aquí e nuevo con un nuevo post sobre programación. Ya queda menos para meternos de nuevo con los videojuegos.

El tema que trataremos hoy es de suma importancia, es algo complicado de entender, pero en ocasiones posteriores nos será de suma utilidad. Es recomendable leerlo un par de veces y practicar con los ejemplos que pondré.

Hasta ahora, si queríamos almacenar el nombre de una persona declarábamos una variable, por ejemplo un vector de 10 caracteres. Esto funcionaría a la perfección si el nombre de la persona es “Pepe”, pero ¿qué ocurre si estamos hablando de “Alejandro Juan Francisco de la Vega y Gámez”? No podriamos almacenarlo. La solución parece ser declarar un vector de 50 caracteres. Es una mal apaño ya que si sólo lo usamos para almacenar “Pepe” estaríamos desaprovechando espacio en memoria principal (RAM).

En el momento en el que necesitamos una variable que contenga varios elementos de un tipo (vector) pero no sabemos el número de elementos de los que precisaremos haremos uso de la memoría dinámica. Esto quiere decir que le indicaremos a lo largo de la ejecución del programa, cúantos elementos de un tipo queremos almacenar. A continuación coloco la estructura básica de las instrucciones para reservar memoria dinámicamente.

tipo *variable;

if((variable = (tipo *)malloc(numero * sizeof(tipo))) == NULL){

printf(“No se ha podido reservar memoria”);

exit(1);

}

Declaramos un puntero llamado variable de tipo “tipo”. Con la función malloc le reservamos espacio. En primer lugar, el paréntesis antes de malloc sirve para indicarle a la función que le queremos reservar espacio a una variable de tipo puntero a tipo. Los argumentos de malloc le indican a la función que queremos almacenar tantos elementos de tipo “tipo” como indique “número”. Todo está incluido dentro de un if, porque hay que comprobar si se realiza correctamente la asignación, sino es así, se devolverá NULL, lanzaremos un mensaje de error y saldremos del programa.

Para acceder a los elementos de variable, lo haremos de la siguiente manera.



variable[5]

En definitiva, lo trataremos como si de un vector se tratara. La función malloc se encuentra en la librería stdlib, por lo que se hará necesario el correspondiente include.

El siguiente ejemplo es algo farragoso e “inútil” pero ilustra muy bien lo que pretendo enseñar:

#include <stdio.h>

#include <stdlib.h>

int main(void){

char *nombre;

int caracteres;

printf(“Introduce el número de caracteres: “);

scanf(“%d”, &caracteres);

fflush(stdin);

if((nombre = (char *)malloc(caracteres * sizeof(char))) == NULL){

printf(“No se ha podido reservar memoria”);

exit(1);

}

printf(“Introduce el nombre: ”);

gets(caracteres); // Esta función lee una cadena de caracteres

puts(caracteres); // Esta otra la imprime

system(“pause”);

return 0;

}

Espero que con este ejemplo las cosas queden algo más claras, ¡Hasta la próxima!


%title

    el 13.12.08

 

Especiales