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!













13 comentario/s
Autor: David Saltares el 13/12/2008








Cuando intento compilar el programa en la parte de:
gets(caracteres);
¿No será por qué “caracteres” es una variable de tipo “int”?
Oops, olvidé decir que cuando intento compilar me da error en esa parte, XD !
Perdón, es gets(nombre) como es lógico, lees una cadena de caracteres (get string) con lo cual la variable debe ser de tipo vector de caracteres.
Saludos.
El programita no me funciona.
Ya hice cambios como lo de “gets(nombre)”, incluí la biblioteca “string.h” y puse fflush(stdin) luego del la linea de scanf. Pero ni así me funciona.
Anda que vais a aprender mucho con éste elemento que no sabe ni como programar. Se supone que explica algo que debe de saber, y se equivoca, bravo.
Buscaos un buen libro, o un buen tutorial y no sigáis al menda éste que no sabe nada. Ya lo demuestra en cada una de sus entregas con los fallos estos.
Cómo está el patio colega xDD
#include
#include
int main(void){
char *nombre;
int caracteres;
printf(”Introduzca numero de caracteres: “);
scanf(”%d”, &caracteres);
if((nombre = (char *)malloc(caracteres*sizeof(int))) == NULL) {
printf(”Error”);
exit(1);
}
fflush(stdin);
printf(”Escribe uan oracion: \n”);
printf(”Has escrito: %s”, gets(nombre));
system(”pause”);
return 0;
}
Ahí teneéis el programa bien resuelto:
Puntualizo un par de cosas, las funciones gets(); y puts(); no pertenecen a la biblioteca string.h sino a la stdio.h.
El problema que le daba a mi compañero David, es no haber utilizado fflush(stdin); para limpiar el buffer del teclado justo antes de pedir el nombre del usuario.
Esto originaba, que el programa tomase el buffer del teclado tal y como estaba y acabase el programa, sin respetar la instrucción gets();
Recordad que siempre que vayáis a utilizar gets(); puts(); o cualquier función que acceda al buffer, previamente debéis de limpiarlo.
El homónimo al código expuesto por el compañero sería:
#include
#include
#include
int main(void){
char *nombre;
int caracteres;
printf(”Introduzca numero de caracteres: “);
scanf(”%d”, &caracteres);
if((nombre = (char *)malloc(caracteres*sizeof(int))) == NULL) {
printf(”Error”);
exit(1);
}
fflush(stdin);
printf(”Escribe uan oracion: \n”);
gets(nombre);
puts(nombre);
system(”pause”);
return 0;
}
Que bien el sistema de comentarios éste que no muestra el retorno de línea. En fin, añadid un “fflush(stdin);” después de terminar el } del if. Y el programa funcionará sin problemas.
Gracias por la aclaración illbnet. Para los demás: no crea que sea justo que critiquen así la guía de David, porque aunque cometa algunos errores, por lo menos se toma la molestia de escribirla para los que quieran aprender a programar juegos.
Faltaba el fflush (limpieza del buffer), ya está corregido.
Navegante: tu que eres muy listo, podrías dejar de criticar, que, por mucho que sepas programar eso se le escapa a cualquiera, igual que cuando escribes rápido pones “cassa” en vez de “casa”. Me gustaría ver como vas manejando y diseñando estructuras de datos y como se te da el análisis de complejidad de algoritmos, por ponerte un ejemplo.
Es cierto que un libro viene muy bien, pero hay gente que lo quiere todo más cercano o no tiene tiempo de informarse cuales son los correctos. Para ellos están este tipo de guías.
Saludos.
Cuando saldrá el siguiente capítulo?
hola este me parece muy divertido y muy sanoo creo,., k es un buen ejemplo.., parasaa todos-. i solo deberian jugar estoo.,., k es muy divertidoo .,., jejej
notecreo