Almacenamiento en Tiempo de Ejecución. C.
Almacenamiento en Tiempo de Ejecución. C.
Almacenamiento en Tiempo de Ejecución. C.
Laboratorios de computación
salas A y B
Profesor: Tista Gacía Edgar M.I.
Asignatura: Estructuras de datos y algoritmos I
Grupo: 1
No de Práctica(s): 4
Integrante(s): Garrido Sánchez Samuel Arturo <418046193>
Semestre: 2018-2
Fecha de entrega: 12 de Marzo del 2018
Observaciones:
CALIFICACIÓN: __________
Almacenamiento en tiempo de ejecución
Introducción
En el almacenamiento de todas las variables que maneja
un programa es indispensable tener una optimización del
espacio de la memoria, aunque en nuestras prácticas de
laboratorio es casi imposible llenar la memoria y llegar a
que la computadora crashee, en grandes programas que
requieran de una gran cantidad de memoria como es el
caso de las ediciones de contenido multimedia, puede lle-
gar a pasar.
Cuando un programa se ejecuta sobre un sistema operativo existe un proceso previo llamado carga-
dor que suministra al programa un bloque contiguo de memoria sobre el cual ha de ejecutarse. El
programa resultante de la compilación debe organizarse de forma que haga uso de este bloque. Para
ello el compilador incorpora al programa objeto el código necesario.
Las técnicas de gestión de la memoria durante la ejecución del programa difieren de unos lenguajes
a otros, e incluso de unos compiladores a otros.
Objetivo de la práctica:
Actividades:
1
Teoría:
Memoria dinámica
La memoria dinámica que se almacena en el heap es aquella que se uti-
liza para almacenar datos que se crean en el medio de la ejecución de
un programa. En general, este tipo de datos puede llegar a ser casi la to-
talidad de los datos de un programa. Por ejemplo, supóngase un pro-
grama que abre un fichero y lee una colección de palabras. ¿Cuántas pa-
labras y de qué tamaño hay en el fichero? Hasta que no se procese el fi-
chero en su totalidad, no es posible saberlo.
• void *malloc(size_t size). Es la función para reservar tantos bytes consecutivos de me-
moria como indica su único parámetro. De-
vuelve la dirección de memoria de la porción
reservada. La memoria no se inicializa a nin-
gún valor.
• void *calloc(size_t nmemb,
size_t size). Reserva espacio para tan-
tos elementos como indica su primer paráme-
tro nmemb, y cada uno de ellos con un tamaño
en bytes como indica el segundo. En otras pa-
labras, reserva nmemb * size bytes conse-
cutivos en memoria. Al igual que la función
anterior devuelve la dirección de memoria al comienzo del bloque reservado. Esta función inicializa
todos los bytes de la zona reservada al valor cero.
• void free(void *ptr). Función que, dado un puntero, libera el espacio previamente reser-
vado. El puntero que recibe como parámetro esta función tiene que ser el que se ha obtenido con una
llamada de reserva de memoria. No es necesario incluir el tamaño. Una vez que se ejecuta esta lla-
mada, los datos en esa porción de memoria se consideran basura, y por tanto pueden ser reutilizados
por el sistema.
• void *realloc(void *ptr, size_t size). Función para redimensionar una porción
de memoria previamente reservada a la que apunta el primer parámetro al tamaño dado como se-
gundo parámetro. La función devuelve la dirección de memoria de esta nueva porción redimensio-
nada, que no tiene por qué ser necesariamente igual al que se ha pasado como parámetro. Los datos
se conservan intactos en tantos bytes como el mínimo entre el tamaño antiguo y el nuevo.
2
Ejercicios propuestos:
Comentario: Creo que debieron hacer más acerca del vector creado ya que se libera al mismo tiempo que
se termina la ejecución, por lo que gráficamente no se nota la diferencia entre un arreglo y una variable
dinámica. Tal vez insertar datos al vector y mostrarlos, liberar la memoria y luego mostrarlo nuevamente
como vacío.
3
2) Sin basura: CALLOC
Como se ha hablado en el ejercicio anterior, las variables dinámicas ofrecen hacer arreglos de manera que al
final de la ejecución sea liberada la memoria que
ocupó la variable. Pues hasta ahora todo bien
pero el detalle que se estipuló en MALLOC que
trae consigo la basura que contenga las direccio-
nes de memoria pues era un inconveniente. La
función CALLOC termina con el inconveniente
anterior, vaciando el contenido de la memoria
asignada y volviéndolo valor NULO (0 en C). El
ejercicio es similar al anterior con la única ex-
cepción de utilizar CALLOC al momento de
asignar la cantidad de memoria, por lo que imprimirá un vector de tamaño asignado por el usuario y mos-
trará los elementos nulos (0) en el vector, ya que habrá limpiado si contenido.
4
Ejercicios en clase
Ejercicio 1
Análisis
a) Explica resultados
for(cont=0;cont<5;cont++){
printf("arreglo[%d]=%d,arreglo[%d]=%d\n",
cont,arreglo[cont],cont,arreglo[cont]);
Luego para insertar elementos en ptr2 llamamos a strcpy para que acomode cada una de las letras de “Hola
amigo como estás” en el espacio reservado a ptr2, pero como el contador llega hasta 100 nos imprime 100
5
espacios. Con las direcciones de memoria de ptr2. Finalmente, en las impresiones de ptr2 nos indica las di-
recciones de memoria seguidas de contador y próximo nos muestra en contenido
de ptr2, que fue llenado con el mensaje.
6
Ejercicio 2
Análisis
a) Explica resultados
El resultado que se muestra en la pantalla es el resultado donde en la función principal no mandamos a lla-
mar a la función de imprimir alumno, por tanto, no aparecerá, lo único que es visible son las líneas:
printf("&din1[%d]=%d \n",j,din1+j);
printf("&din2[%d]=%d \n”,j,din2+j);
Que en lo que respecta a din1 y din2 nos muestran el contador dentro de los corchetes para mostrar el nú-
mero del arreglo y din1 + j y din2 + j nos indica que a la cantidad de memoria reservada para ellos los
asigna a din1 y din2, con las funciones CALLOC y MALLOC fue asignado pero recuerde que MALLOC
trae consigo basura que ha quedado en la memoria, mientras que CALLOC nos asigna muchos espacios de
memoria en el que primero va de la cantidad de elementos que deseamos insertar y luego la cantidad de es-
pacio que le deseamos asignar.
7
dinámicas para que ahora tenga un tamaño de 20.
c) Reemplazo de (Alumno*)malloc(5*sizeof(Alumno))
Ejercicio 3
• Diseña un tipo de dato abstracto llamado libro en el cual puedas encapsular elementos como título,
autor, editorial, id del libro.
• Crear un arreglo dinámico de libros en el cual se solicite al usuario en tiempo de ejecución, el ta-
maño de dicho arreglo.
• Dentro de la función principal, el usuario deberá llenar el número de libros, determinando el tamaño
del arreglo. Recuerda que es recomendable el uso de funciones para trabajar con implementaciones.
Análisis
8
Conclusión
El objetivo de la práctica:
• Utilizarás funciones en lenguaje C que permiten reservar y almacenar información de ma-
nera dinámica (en tiempo de ejecución).
Crítica constructiva:
Bibliografía
https://w3.ual.es/~acorral/DSO/Tema_3.pdfhttps://www.fing.edu.uy/tecnoinf/mvd/cur-
sos/prinprog/material/teo/prinprog-teorico08.pdf
https://www.tutorialspoint.com/c_standard_library/c_function_calloc.htm
https://msdn.microsoft.com/en-us/library/3f8w183e.aspx