Page 222

4.1 Vectores din´amicos Los programas correctamente escritos deben comprobar si se pudo obtener la memoria solicitada y, en caso contrario, tratar el error. 1 2 3 4 5 6 7

a = malloc(talla * sizeof (int)); if (a == NULL) { printf ("Error: no hay memoria suficiente\n"); } else { ... }

Es posible (y una forma de expresi´ on idiom´atica de C) solicitar la memoria y comprobar si se pudo obtener en una u ´nica l´ınea (presta atenci´on al uso de par´entesis, es importante): 1 2 3 4 5 6

if ( (a = malloc(talla * sizeof (int))) == NULL) { printf ("Error: no hay memoria suficiente\n"); } else { ... }

Nuestros programas, sin embargo, no incluir´an esta comprobaci´on. Estamos aprendiendo a programar y sacrificaremos las comprobaciones como ´esta en aras de la legibilidad de los programas. Pero no lo olvides: los programas con un acabado profesional deben comprobar y tratar posibles excepciones, como la no existencia de suficiente memoria. Fragmentaci´ on de la memoria Ya hemos dicho que malloc puede fracasar si se solicita m´ as memoria de la disponible en el ordenador. Parece l´ ogico pensar que en un ordenador con 64 megabytes, de los que el sistema operativo y los programas en ejecuci´ on han consumido, digamos, 16 megabytes, podamos solicitar un bloque de hasta 48 megabytes. Pero eso no est´ a garantizado. Imagina que los 16 megabytes ya ocupados no est´ an dispuestos contiguamente en la memoria sino que, por ejemplo, se alternan con fragmentos de memoria libre de modo que, de cada cuatro megabytes, uno est´ a ocupado y tres est´ an libres, como muestra esta figura:

En tal caso, el bloque de memoria m´ as grande que podemos obtener con malloc es de ¡s´ olo tres megabytes! Decimos que la memoria est´ a fragmentada para referirnos a la alternancia de bloques libres y ocupados que limita su disponibilidad. La fragmentaci´ on no s´ olo limita el m´ aximo tama˜ no de bloque que puedes solicitar, adem´ as, afecta a la eficiencia con la que se ejecutan las llamadas a malloc y free.

Tambi´en puedes usar NULL para inicializar punteros y dejar expl´ıcitamente claro que no se les ha reservado memoria. vector dinamico 1.c 1 2

vector dinamico.c

#include <stdlib.h> #include <stdio.h>

3 4 5 6 7

int main(void) { int * a = NULL; int talla, i;

8 9 10 11 12 13 14

printf ("N´ umero de elementos: "); scanf ("%d", &talla); a = malloc( talla * sizeof (int) ); for (i=0; i<talla; i++) a[i] = i; free(a); a = NULL;

15

216

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