Page 237

4 Estructuras de datos: memoria din´amica

CC 2003, 2008 Andr´ es Marzal e Isabel Gracia

matriz dinamica.c 1 2

matriz dinamica.c

#define <stdio.h> #define <stdlib.h>

3 4 5 6 7

int main(void) { float ** m = NULL ; int filas, columnas;

8

printf ("Filas: "); scanf ("%d", &filas); printf ("Columnas: "); scanf ("%d", &columnas);

9 10 11

/* reserva de memoria */ m = malloc(filas * sizeof (float *)) ; for (i=0; i<filas; i++) m[i] = malloc(columnas * sizeof (float)) ;

12 13 14 15 16

/* trabajo con m[i][j] */ ...

17 18 19

/* liberaci´ on de memoria */ for (i=0; i<filas; i++) free(m[i]) ; free(m) ; m = NULL ;

20 21 22 23 24 25

return 0;

26 27

}

Analicemos poco a poco el programa.

Declaraci´ on del tipo Empecemos por la declaraci´ on de la matriz (l´ınea 6). Es un puntero un poco extra˜ no: se declara como float ** m. Dos asteriscos, no uno. Eso es porque se trata de un puntero a un puntero de enteros o, equivalentemente, un vector din´ amico de vectores din´ amicos de enteros.

Reserva de memoria Sigamos. Las l´ıneas 9 y 10 solicitan al usuario los valores de filas y columnas. En la l´ınea 13 encontramos una petici´ on de memoria. Se solicita espacio para un n´ umero filas de punteros a float. Supongamos que filas vale 4. Tras esa petici´on, tenemos la siguiente asignaci´on de memoria para m:

m

0

1

2

3

El vector m es un vector din´ amico cuyos elementos son punteros (del tipo float *). De momento, esos punteros no apuntan a ninguna zona de memoria reservada. De ello se encarga la l´ınea 15. Dicha l´ınea est´ a en un bucle, as´ı que se ejecuta para m[0], m[1], m[2], . . . El efecto es proporcionar un bloque de memoria para cada celda de m. He aqu´ı el efecto final: Introducci´ on a la Programaci´ on con C

231

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement