Reserva Dinámica de Memoria

Anuncio
Introducción a la
Programación
11 Reserva dinamica de Memoria
Roberto Marabini — Introduccin a la programacin — ETS – p.1/9
Estructuras de Datos Dinámicas
Son estructuras de datos capaces de crecer
o disminuir en tamaño según las
necesidades del programa.
Facilitan el control del consumo de la
memoria.
Para crecer se requiere memoria al sistema
operativo. Se accede a esta memoria
mediante un sistema de punteros.
Cuando esta memoria no sea necesaria se
puede liberar posibilitando una gestion de
memoria más eficiente
Roberto Marabini — Introduccin a la programacin — ETS – p.2/9
malloc y free
Los programas reservan memoria (en tiempo
de ejecución) mediante la función malloc.
La memoria se puede solicitar en cualquier
momento.
La única restricción es que exista memoria
no asignada en el sistema.
Una vez que el programa no necesite esta
memoria se puede liberar usando la función
free de forma que otra aplicación la pueda
usar.
Al terminar un programa se libera toda la
memoria que se le ha asignado
Roberto Marabini — Introduccin a la programacin — ETS – p.3/9
malloc y free (Ejemplo)
int main()
{
int *p;
p = (int *)malloc(sizeof(int));
if (p == NULL)
{
printf("ERROR: Out of memory\n");
return 1;
}
*p = 5;
printf("&d\n", *p);
free(p);
return 0;
}
Roberto Marabini — Introduccin a la programacin — ETS – p.4/9
malloc y free (Ejemplo)
int *p;
p = (int *)malloc(sizeof(int));
if (p == NULL)
{
printf("ERROR: Out of memory\n");
return 1;
}
La función malloc comprueba si es posible reserva
la cantidad de memoria solicitada.
La cantidad de memoria solicitada se especifica es el
parametro sizeof(int) que se pasa a malloc
Si no hay suficiente memoria, malloc devuelve NULL
De lo contrario malloc reserva la memoria pedida y
devuelve un puntero a la misma
Roberto Marabini — Introduccin a la programacin — ETS – p.5/9
malloc y free (Ejemplo)
free(p);
El comando malloc se usa para reservar memoria.
Para liberarla se usa free.
Cuando se libera un bloque de memoria este puede
ser reutilizado por el mismo u otro programa
free requiere un puntero a la zona de memoria
reservada.
Roberto Marabini — Introduccin a la programacin — ETS – p.6/9
Dos preguntas
int *p;
p = (int *)malloc(sizeof(int));
if (p == NULL)
{
printf("ERROR: Out of memory\n");
return 1;
}
¿Es realmente importante comprobar si malloc
devuelve NULL?
¿Que ocurre si se me olvida liberar la memoria
reservada por un programa?
¿Que ocurre si libero dos veces la memoria asignada
a un puntero?
Roberto Marabini — Introduccin a la programacin — ETS – p.7/9
Ejemplo con estructuras
#include <stdio.h>
struct rec
{
int i;
float f;
char c;
};
int main()
{
struct rec *p; // casting
p=(struct rec *) malloc (sizeof(struct rec));//Comprueba NULL!!!
(*p).i=10;//p->i
(*p).f=3.14;
(*p).c=’a’;
printf("%d %f %c\n",(*p).i,(*p).f,(*p).c);
free(p);
return 0;
}
Roberto Marabini — Introduccin a la programacin — ETS – p.8/9
Ejercicio
amalloc.c
#define MAX 10
int main()
{
int *a;
int i;
// reserva memoria para un array de MAX enteros
for(i=0; i<MAX; i++)
{
a[i]=i;//OJO esto puede ser incorrecto (*a)[i]
printf("a[%d]=%d\n",i,a[i]);
}
// libera la memoria
return 0;
}
Roberto Marabini — Introduccin a la programacin — ETS – p.9/9
Descargar