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