Está en la página 1de 10

Práctica #4: Almacenamiento en tiempo de ejecución.

Objetivo: Utilizarás funciones en lenguaje C que permiten reservar y almacenar información de


manera dinámica (en tiempo de ejecución).

Ejercicios propuestos por la guía de laboratorio.


Ejemplo 1.

En este ejemplo se propuso la función malloc, la cual es una forma de implementar el uso de la
memoria dinámica , toma como parámetros el número de bytes que se desea reservar y devuelve un
apuntador de tipo void, en caso de que no sea posible reservar el espacio en memoria, se devuelve el
valor nulo. En este programa se solicita al usuario ingresar el número de localidades de memoria que
necesita y como salida del programa, se imprime un arreglo con las direcciones de las localidades de
memoria disponibles.

En estas líneas de código podemos observar inicializar la función malloc .


La salida del programa se puede observar de la siguiente forma.
Ejemplo 2.
En este ejemplo emplearemos la función calloc y a diferencia de malloc, usa como parámetros el
número de localidades de memoria y en segundo parámetro, el tamaño de cada una de esas localidades
de memoria. Otra diferencia notable que tiene con malloc es que inicializa la memoria reservada en 0
y no nos muestra lo que tenía almacenado con anterioridad como lo hace malloc.

La siguiente captura muestra la forma de inicializar calloc

(int *) se refiere al tipo de dato que contendrá, núm significa el número de localidades de memoria que
deseamos y sizeof genera el número de bytes que genera un entero para ser almacenado.

En la siguiente captura se adjunta la salida de los datos

Ejemplo 3.
En este ejemplo se implementa la función realloc, la cual permite redimensionar el espacio asignado
previamente de forma dinámica, es decir, permite aumentar el tamaño de la memoria reservada de
manera dinámica. Si el apuntador que se desea redimensionar tiene el valor nulo, la función actúa
como la función malloc. Si la reasignación no se pudo realizar, la función devuelve un apuntador a
nulo, dejando intacto el apuntador que se pasa como parámetro (el espacio reservado
previamente).

En la captura anterior se puede observar cómo se emplea la función malloc para asignar localidades de
memoria y por otro lado la función realloc para redistribuir el área de memoria la cual ya fue asignada
por malloc.
La salida de los datos se muestra a continuación.
Por otro lado tenemos la función free, la cual sirve para liberar memoria reservada cuando esta ya no
sé utilice. Su sintaxis es la siguiente:
void free(void *ptr);
El parámetro ptr es el apuntador al inicio de la memoria que se desea liberar. Si el
apuntador es nulo la función no hace nada.

EJERCICIOS PROPUESTOS PARA EL DESARROLLO DE LA PRÁCTICA

Ejercicio #1

El ejercicio propuesto nos muestra en pantalla dos formas de imprimir las direcciones de memoria y su
valor contenido en estas, una de ellas es a partir de un arreglo y esto se logra de la manera habitual,
usando sus índices para referirnos a la posición en la memoria y así conocer su valor. Por otro lado se
encuentra la forma de imprimir a través de la función calloc, la cual con anterioridad fue explicada, el
programa base brindado para la realización de esta práctica nos arroja como salido lo siguiente.

Este segmento de la salida del programa se realizó de la forma tradicional o de la forma ya antes
trabajada durante el semestre, pues como se había mencionado, se trabaja con los índices del arreglo.

Esta captura muestra la salida de las direcciones de memoria declaradas en la función malloc, como se
observa, se imprime la dirección de memoria de las 10 localidades que se solicitó, además de mostrar
que está contenida en cada una de ellas, podemos deducir que en este momento del programa eso se
considera basura.
Después de esta breve introducción de los resultados que muestra el programa sin modificar nada
iniciaremos con las modificaciones que harán que apliquemos lo visto en clase.
Por un lado se pide al usuario agregar instrucciones para asignar valores en las localidades de memoria
reservadas con memoria dinámica, los cuales deberán ser múltiplos de 5. Esto se logra a través de
implementar las siguientes instrucciones.

La instrucción *(ptr+cont) nos dice que va a apuntar a la localidad a la que apunta el apuntador
original más la cifra que tome la variable cont dependiendo del ciclo y esto va estar igualado a
5*(cont+1), lo que hará que en cada localidad de memoria se guarda al que se apunte se guarde un
múltiplo de 5, tal es el caso que en la primer localidad se guardará el 5, en la segunda el 10 y así
consecutivamente hasta llenar las direcciones solicitadas. La salida es la siguiente.

Por realizar, se solicita la reasignación de *ptr de modo que utilicemos la función calloc de en vez de
malloc. Para ello tomaremos como referencia el programa sin modificaciones y la de modificaciones
previas.

Como se mencionaba se modifica la asignación de *ptr y ahora utilizamos la función calloc pero
además de eso tenemos que modificar sus parámetros, debido a que calloc utiliza dos parámetros, los
cuales son las localidades solicitadas y el tamaño de estas, para ello se usa la función sizeof(int) la cual
insertará el tamaño que necesitará un entero debido a que este es el solicitado. El programa nos
muestra lo siguiente.
Como se observa, no se pueda identificar una una diferencia a simple vista debido a que se usó el
programa modificado para que almacenará múltiplos de cinco, pero si usamos el programa propuesto
se obtiene los siguiente.

Como se observa, los valores de las direcciones de memoria se inicializan en 0 y no nos muestra
basura a comparación cuando usamos la función malloc, calloc es más flexible en ese aspecto,
limpiando las localidades de memoria por nosotros.

Por último en el programa se pide implementar la función realloc que como recordaremos sirve para la
reasignación, para esto asignaremos ptr con un nuevo tamaño de 20 espacios en el mismo apuntador
con lo que se hace a partir de las siguientes líneas de código.

Como la reasignación cerra en el mismo apuntador se declara ptr=(int*)realloc(ptr,sizeof(int)*20); y


como resultado de esto nos muestra lo siguiente.
Vemos que se reasigno el tamaño y lo que muestra son 10 localidades de memoria con múltiplos de 5
y las 10 restantes con basura debido a que solo aumentamos el tamaño y no que llenará las localidades
restantes. Por otro lado cuando se le asignó otro apuntador diferente se preservan los resultados como
se observa.

Podemos concluir que no hay ninguna diferencia.en usar el mismo apuntador u otro.

Ejercicio 2.

Lo primero que debemos observar es que el programa cuenta con varios errores, los cuales son las
bibliotecas que no son las adecuadas, los parámetros de las funciones utilizadas no están definidas
correctamente con el tipo de dato que devuelven. El código sin correcciones no compila y por ende
solo muestra lo siguiente.
Por lo tanto cuando corregimos los errores listados anteriormente, se obtiene la siguiente salida

La siguiente captura muestra las direcciones de memoria de los apuntadores que están apuntadas a una
estructura. La cual sabemos que tiene 3 apuntadores de tipo Alumno debido a que este es el nombre de
la estructura lo que implica que es el tipo de dato. Para el primer apuntador se usa la función de
malloc, para la segunda usa el apuntador calloc y por último el apuntador 3 le asigna el apuntador por
medio de realloc, que implica al mismo tiempo que asigna el tamaño.

Como resultado del programa, el tamaño que arroja la estructura Alumno es de 0 como se muestra.
Esto nos arroja un tamaño de 0 debido a que aún la estructura alumno no contiene variables dentro de
ella y por ello nos arroja eso, una vez declarados diferentes elementos dentro de la estructura crecerá
el tamaño de la misma.

Ejercicio 3.
En el ejercicio 3 nos pedían una estructura llamada automóvil en la cual pudiera incluir
marca,modelo,color y el tipo de auto. En el cual tuve demasiadas dudas y no pude darme cuenta de
cómo abordar el problema por lo que sólo implementa la declaración de las estructuras, debido a que
me quede en blanco.
Las dificultades que surgieron a lo largo de la realización de la práctica era la correción de algunos
parámetros, lo que hacía que no se efectúa bien el dichoso programa. No todos los ejercicios
propuestos para el desarrollo de la práctica se pudieron efectuar debido a la confusión que presentaba
durante la declaración de variables y también porque no compilaba el programa elaborado. Otra causa
por la que no se logró concluir la práctica era debido al poco conocimiento respecto a la declaración
de funciones como realloc, ya que es la que en lo personal se me complica más usarla.
La práctica tuvo gran relevancia con los temas vistos durante las clases y no solo eso aborda el tema
de memoria dinámica, pues usamos arreglos, estructuras, apuntadores, funciones, así haciendo que un
programa sea de lo más eficiente al utilizar diferentes herramientas, dando una extensa gama para que
como programadores desarrollemos programas basados en todos estos elementos.
Las ventajas que conlleva el desarrollo de esto es como se había dicho antes tener una extensa gama
de herramientas que servirán para el futuro programador, definido esto no encunetro una desventaja
que esto conlleva, la práctica me pareció de gran importancia para reforzar los conocimientos
adquiridos.
Para concluir esta práctica concluimos que no se cumplieron los objetivos de la práctica debido a que
no se llevó a cabo la realización de todos los programas correctamente y eso implica el
incumplimiento de los objetivos, pero si lo vemos por un lado objetivo esto sirve como una
retroalimentación para darnos cuenta en qué aspectos de programación carecemos de habilidad.

También podría gustarte