ASIGNACION DINAMICA DE MEMORIA
Slides in this set (4)
-
Asignación dinámica de memoria

- Se ha tratado cómo “conseguir” nuevas posiciones de
- memoria (ateniéndose al lenguaje de la parte algorítmica: cómo funciona el
- Módulo de Gestión de la Asignación Dinámica de C)
- Caption: RUIZ CASTAÑEDA INGRID VANESSA
-
- • En muchas ocasiones no es posible conocer de antemano la
- cantidad de variables necesarias para un programa
- computacional.
- • 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.
- • El manejo de memoria dinámica es la base del poder del
- lenguaje C y le da la capacidad de crear programas complejos
- que emplean grandes cantidades de memoria y los maneja de
- manera eficiente.
-
- 1 • void *calloc(size_t nobj, size_t size)
- calloc 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.
- Ejemplo:
- char * c;
- c = (char *) calloc (40, sizeof(char));
- 2• 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.
- EJEMPLO:
- #define N 10
- #include
- 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().
- EJEMPLO
- main()
- {
- char uno[20], *dos;
- printf ("\nDame una cadena:");
- gets(uno);
- copia2(uno, &dos); /*Inicialmente dos no apunta a ningún sitio*/
- /*En copia2 se modificará el valor de dos */
- printf ("\nLa copia de %s\n es %s\n", uno, dos);
- }
Information
- Description
- muestra las distintas formas en que definimos una biblioteca
- Created by
- vaneruiz1496 · Mar 2016
- Updated
- Mar 10, 2016
- Views
- 23
- Tags
- Rating