Page 250

4.4 Redimensionamiento de la reserva de memoria

1

#include <stdlib.h>

2 3 4 5

int main(void) { int * a;

6

a = malloc(10 * sizeof (int)); // Se pide espacio para 10 enteros. ... a = realloc(a, 20 * sizeof (int)); // Ahora se ampl´ıa para que quepan 20. ... a = realloc(a, 5 * sizeof (int)); // Y ahora se reduce a s´ olo 5 (los 5 primeros). ... free(a);

7 8 9 10 11 12 13 14

return 0;

15 16

}

La funci´ on realloc recibe como primer argumento el puntero que indica la zona de memoria que deseamos redimensionar y como segundo argumento, el n´ umero de bytes que deseamos asignar ahora. La funci´ on devuelve el puntero a la nueva zona de memoria. ¿Qu´e hace exactamente realloc? Depende de si se pide m´ as o menos memoria de la que ya se tiene reservada: Si se pide m´ as memoria, intenta primero ampliar la zona de memoria asignada. Si las posiciones de memoria que siguen a las que ocupa a en ese instante est´an libres, se las asigna a a, sin m´ as. En caso contrario, solicita una nueva zona de memoria, copia el contenido de la vieja zona de memoria en la nueva, libera la vieja zona de memoria y nos devuelve el puntero a la nueva. Si se pide menos memoria, libera la que sobra en el bloque reservado. Un caso extremo consiste en llamar a realloc con una petici´on de 0 bytes. En tal caso, la llamada a realloc es equivalente a free. Al igual que malloc, si realloc no puede atender una petici´on, devuelve un puntero a NULL. Una cosa m´ as: si se llama a realloc con el valor NULL como primer par´ametro, realloc se comporta como si se llamara a malloc. Como puedes imaginar, un uso constante de realloc puede ser una fuente de ineficiencia. Si tienes un vector que ocupa un 1 megabyte y usas realloc para que ocupe 1.1 megabyes, es probable que provoques una copia de 1 megabyte de datos de la zona vieja a la nueva. Es m´as, puede que ni siquiera tengas memoria suficiente para efectuar la nueva reserva, pues durante un instante (mientras se efect´ ua la copia) estar´as usando 2.1 megabytes. Desarrollemos un ejemplo para ilustrar el concepto de reasignaci´on o redimensionamiento de memoria. Vamos a dise˜ nar un m´ odulo que permita crear diccionarios de palabras. Un diccionario es un vector de cadenas. Cuando creamos el diccionario, no sabemos cu´antas palabras albergar´a ni qu´e longitud tiene cada una de las palabras. Tendremos que usar, pues, memoria din´amica. Las palabras, una vez se introducen en el diccionario, no cambian de tama˜ no, as´ı que bastar´a con usar malloc para gestionar sus reservas de memoria. Sin embargo, la talla de la lista de palabras s´ı var´ıa al a˜ nadir palabras, as´ı que deberemos gestionarla con malloc/realloc. Empecemos por definir el tipo de datos para un diccionario. 1 2 3 4

struct Diccionario { char ** palabra; int palabras; };

Aqu´ı tienes un ejemplo de diccionario que contiene 4 palabras: palabra 0

a n u a l \0

1

d a d i v o s o \0

2

m a n o \0

3

t a c o \0

palabras

4

244

Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement