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)
Pie de foto: : RUIZ CASTAÑEDA INGRID VANESSA
Diapositiva 2
• 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.
fundamentos teóricos
Diapositiva 3
En la <stdlib.h> están definidas:
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));
Diapositiva 4
• 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(). EJEMPLOmain(){ 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);
}