MEMORIA DINÁMICA

Description

ACTIVIDAD LABORATORIO MEMORIA DINAMICA
diazmtzal
Note by diazmtzal, updated more than 1 year ago
diazmtzal
Created by diazmtzal about 8 years ago
19
0

Resource summary

Page 1

Asignación dinámica de memoriaHasta el momento sólo se ha visto cómo el lenguaje C define y 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 (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).

Page 2

En la <stdlib.h> están definidas las siguientes funciones:

• void *calloc(size_t nobj, size_t size)Calloc obtiene (reserva) espacio en memoria para alojar un vector (una colección) denobj objetos, cada uno de ellos de tamaño size. Si no hay memoria disponible sedevuelve NULL. El espacio reservado se inicializa a bytes de ceros.Obsérvese que calloc devuelve un (void *) y que para asignar la memoria quedevuelve a un tipo Tipo_t hay que utilizar un operador de ahormado: (Tipo_T *)Ejemplo:char * c;c = (char *) calloc (40, sizeof(char));

Page 3

• 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. Elcontenido de la memoria no cambiará en las posiciones ya ocupadas. Si el nuevotamaño es mayor que el antiguo, no se inicializan a ningún valor las nuevasposiciones. En el caso en que no hubiese suficiente memoria para “realojar” al nuevopuntero, se devuelve NULL y p no varía.El puntero que se pasa como argumento ha de ser NULL o bien un puntero devueltopor malloc(), calloc() o realloc().

Page 4

#define N 10#include <stdio.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;}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() orealloc().

Page 5

El siguiente programa también soluciona el anterior problema 2. La diferenciaentre ambas soluciones está en que el nuevo vector no tiene un tamaño fijo,sino que se le asigna en función del tamaño del vector original.

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);}

Show full summary Hide full summary

Similar

Diapositivas de Diseño gráfico, evolución y tendencias
Samantha Molina Vega
Diseño gráfico, evolución y tendencias - APUNTE
escandoncb
Diseño gráfico, evolución y tendencias
Samantha Molina Vega
PRESENTACIÓN EN GOCONR
weownthenigh
Eliminacion de un nodo
LUIS FERNANDO RUIZ GARCIA
test de Diseño gráfico, evolución y tendencias
Samantha Molina Vega
Notación algoritmica
Jenni' Burbujeante
factores culturales que afectan las operaciones de los negocios internacionales
JOHANA HERNANDEZ
EL LIBRO Y SUS PARTES
A14N 3URT0N
Técnicas de recopilación.
onlyhyuk8
Diapositivas de Correcion y edicion de fotografia
efrainska