Created by alanovich2010
over 8 years ago
|
||
Memoria dinamicaCon este momento sólo se ha visto cómo el lenguaje C lo define y se utiliza los punteros para acceder a las posiciones de memoria asignadas a un programa. Sin embargo, no se ha tratado cómo “conseguir” nuevas posiciones de memoria (por la situación al lenguaje de la parte algorítmica: esto se funciona el Módulo de Gestión de la Asignación Dinámica de C).Existen aplicaciones que requieren de enormes cantidades de arreglos o datos por momentos breves en el funcionamiento del mismo, por lo que no es viable declarar de antemano a estas como variables, globales o locales de una función. Lo anterior implica emplear funciones de ANSI C que permiten reservar memoria de manera dinámica y ampliarla, reducirla o destruirla en tiempo de ejecución. Todos los programas definen variables que pueden ser definidas como globales y locales. Las variables globales y del programa principal (main) se almacenan en posiciones fijas de la memoria llamada memoria de datos. Las variables locales se almacenan en el segmento de memoria llamada pila y existen solo cuando se hace una invocación a la función que las declaro. También se pueden declarar variables estáticas locales que también se almacenan en segmentos fijos de memoria o en la memoria de datos , sin embargo, también están disponibles en la función que las declaro.En la están definidas las siguientes funciones: void *calloc(size_t nobj, size_t size):calloc se obtiene (reserva) espacio en memoria para alojar un vector (una colección) de nobj objetos, cada uno de ellos de tamaño size. Si no hay memoria disponible se devuelve NULL. El espacio reservado se inicializa a bytes de ceros. Por ejemplo: Obsérvese que calloc devuelve un (void *) y que para asignar la memoria que devuelve a un tipo Tipo_t hay que utilizar un operador de ahormado: (Tipo_T *) Otro ejemplo: char * c; c = (char *) calloc (40, sizeof(char)); void *malloc(size_t size):malloc funciona de forma similar a calloc salvo que: a) no inicializa el espacio y b) es necesario saber el tamaño exacto de las posiciones de memoria solicitadas. El ejemplo anterior se puede reescribir: char * c; c = (char *) malloc (40*sizeof(char)); • void *realloc(void *p, size_t size) realloc cambia el tamaño del objeto al que apunta p y lo hace de tamaño size. El contenido de la memoria no cambiará en las posiciones ya ocupadas. Si el nuevo tamaño es mayor que el antiguo, no se inicializan a ningún valor las nuevas posiciones. En el caso en que no hubiese suficiente memoria para “realojar” al nuevo puntero, se devuelve NULL y p no varía. El puntero que se pasa como argumento ha de ser NULL o bien un puntero devuelto por malloc(), calloc() o realloc().
Ejemplo#define N 10 #include <studio.h> main(){ char c, *cambiante; int i; i=0; cambiante = NULL; printf("\nIntroduce una frase. Terminada en [ENTER]\n"); while ((c=getchar()) != '\n') { if (i % N == 0){ printf("\nLlego a %d posiciones y pido hasta %d", i, i+N); cambiante=(char *)realloc((char *)cambiante,(i+N)*sizeof(char)); if (cambiante == NULL) exit(-1); } /* Ya existe suficiente memoria para el siguiente carácter*/ cambiante[i++] = c; } /* Antes de poner el terminador nulo hay que asegurarse de que haya suficiente memoria */ if ((i % N == 0) && (i != 0)){ printf("\nLlego a %d posiciones y pido hasta %d", i, i+N); cambiante=realloc((char *) cambiante, (i+N)*sizeof(char)); if (cambiante == NULL) exit(-1); } cambiante[i]=0; printf ("\nHe leido %s", cambiante); } •void free(void *p) free(): libera el espacio de memoria al que apunta p. Si p es NULL no hace nada. Además p tiene que haber sido “alojado” previamente mediante malloc(), calloc() o realloc()la opción de crear diferentes tipos de variables de forma dinámica, para crear tales variables se utilizan funciones como: malloc(), realloc(), calloc(), y free().
Asignación dinámica de memoria Por lo regular cuando se diseña un algoritmo, se debe conocer que elementos de entrada tendrá y cual será la salida, sin embargo, en algunas ocasiones no se sabe de forma exacta el numero de variables que requerirá nuestro algoritmo. Por ejemplo, suponga que se van a registrar el numero de calificaciones de un conjunto de alumnos, para resolver este problema se podría utilizar una arreglo de calificaciones, sin embargo, si el numero de alumnos crece, nuestro programa ya no seria valido, puesto que no existen los recursos necesarios para almacenar todos los datos validos.
Want to create your own Notes for free with GoConqr? Learn more.