Page 220

4.1 Vectores din´amicos

4.1.1.

malloc, free y NULL

Afortunadamente, podemos definir, durante la ejecuci´on del programa, vectores cuyo tama˜ no es exactamente el que el usuario necesita. Utilizaremos para ello dos funciones de la biblioteca est´andar (disponibles incluyendo la cabecera stdlib.h): malloc (abreviatura de ((memory allocate)), que podemos traducir por ((reservar memoria))): solicita un bloque de memoria del tama˜ no que se indique (en bytes); free (que en ingl´es significa ((liberar))): libera memoria obtenida con malloc, es decir, la marca como disponible para futuras llamadas a malloc. Para hacernos una idea de c´ omo funciona, estudiemos un ejemplo: vector dinamico.c

vector dinamico.c 1 2

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

3 4 5 6 7

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

8

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 ;

9 10 11 12 13 14 15

return 0;

16 17

}

F´ıjate en c´ omo se ha definido el vector a (l´ınea 6): como int * a, es decir, como puntero a entero. No te dejes enga˜ nar: no se trata de un puntero a un entero, sino de un puntero a una secuencia de enteros. Ambos conceptos son equivalentes en C, pues ambos son meras direcciones de memoria. La variable a es un vector din´ amico de enteros, pues su memoria se obtiene din´amicamente, esto es, en tiempo de ejecuci´ on y seg´ un convenga a las necesidades. No sabemos a´ un cu´antos enteros ser´ an apuntados por a, ya que el valor de talla no se conocer´a hasta que se ejecute el programa y se lea por teclado. Sigamos. La l´ınea 10 reserva memoria para talla enteros y guarda en a la direcci´on de memoria en la que empiezan esos enteros. La funci´on malloc presenta un prototipo similar a ´este: stdlib.h ... void * malloc(int bytes); ...

Es una funci´ on que devuelve un puntero especial, del tipo de datos void *. ¿Qu´e significa void *? Significa ((puntero a cualquier tipo de datos)), o sea, ((direcci´on de memoria)), sin m´as. La funci´ on malloc no se usa s´ olo para reservar vectores din´amicos de enteros: puedes reservar con ella vectores din´ amicos de cualquier tipo base. Analicemos ahora el argumento que pasamos a malloc. La funci´ on espera recibir como argumento un n´ umero entero: el n´ umero de bytes que queremos reservar. Si deseamos reservar talla valores de tipo int, hemos de solicitar memoria para talla * sizeof (int) bytes. Recuerda que sizeof (int) es la ocupaci´on en bytes de un dato de tipo int (y que estamos asumiendo que es de 4). Si el usuario decide que talla valga, por ejemplo, 5, se reservar´a un total de 20 bytes y la memoria quedar´ a as´ı tras ejecutar la l´ınea 10: 0

1

2

3

4

a 214

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