You are on page 1of 4

Introduccin a la Memoria Dinmica:

Hasta el momento para el manejo de estructuras de datos utilizamos memoria esttica, estas
estructuras no cambian su tamao (en memoria) luego de que fueron compiladas.
Asignacin estatica de la memoria: la reserva de memoria (asignacin) se hace en tiempo de
compilacin del sistema.
Cmo podemos variar la memoria que utilizara una estructura a lo largo de la ejecucin de un
programa?
Para esto utilizaremos la memoria dinmica, lo que nos permitir crear y destruir estructuras
de datos en tiempo de ejecucin.
La memoria dinmica se maneja mediante el uso de un tipo de datos denominado punteros
(pointer / apuntador).
Obs: La memoria dinmica nos permite hacer un uso eficiente de la memoria. Solicitaremos
memoria cuando la necesitemos y la liberaremos cuando dejemos de usarla. De esta forma no
se tiene memoria reservada sin ser utilizada, como pasa con la memoria esttica.
Puntero:
Un puntero es un tipo de datos que permite guardar la direccin de memoria, donde se
encuentra una variable de otro tipo de datos conocido (int, char, etc).
Para utilizar las variables de tipo puntero se debe definir el tipo de datos al que estas
apuntaran.
Ej: int *p; //puntero a datos de tipo int.
char *c; // puntero a datos de tipo char.
Las variables de tipo puntero pueden estar:
-apuntando a una variable del tipo de datos correspondiente
-tener el valor NULL, tiene un valor pero no apunta
-no tener valor (o como se dice comnmente apuntar a basura)
Obs: muchas veces para poder usar la macro NULL se debe importar la librera stdlib.h.
Para acceder a la variable que es apuntado por un puntero p, se debe escribir *p.
Ej: si quiero comparar el valor de las variables apuntadas por p y q (suponiendo estas
son comparables) debo hacer *p == *q.
Atencion!! *p == *q DISTINTO de p == q. En la primer sentencia estamos
comparando los valores apuntados por p y q, mientras que en la otra se estn
comparando las direcciones de memoria.


Operaciones para el manejo de punteros.
1. Para crear variables dinmicas se solicita un espacio de memoria para un dato
del tipo que ser apuntado y se referencia a un puntero, para ello usamos la
funcin malloc:
Ej: int *p = malloc ( size_t, tam_bloque); // se crea e inicializa un puntero de tipo int.
2. Adems de crear variables dinmicas nos interesa destruirlas para liberar la
memoria que estas tiene reservada, para esto utilizamos la funcin free.
Delete p; // libera la memoria a la que p est apuntando, deja p sin valor.
// Poner lo de la librera para malloc y free.
3. Asignacin: hay tres formas de asignarle valor a un puntero:
o p = NULL
hace que p "no apunte"


o p = q
donde q es otra variable del mismo tipo que p. Entonces q debe tener
valor. Luego de esta asignacin, o bien p y q son NULL (no apuntan) o
bien apuntan a la misma variable:

o malloc(size_t, tam_bloq) es la manera de generar punteros efectivos
a variables




Manejo de Punteros
1. Dada una situacin

Decimos que p, q (sus valores) son alias de la misma variable
Qu ocurre al ejecutarse free(p) ?

o q queda apuntando a una variable inexistente (lo cual es diferente de
contener el valor NULL, es decir de "NO APUNTAR")
o De hecho, ocurre que los contenidos de ambas variables son intiles. O
sea, la situacin es anloga al caso en que no tienen valor
o Ejecutar *p o *q en esta situacin conduce a un error de ejecucin (el
mensaje suele ser "Segmentation fault" o algo que sugiera "ausencia de
variable alojada en la direccin en cuestin")
o !!! En presencia de alias, la ejecucin de free puede tener, como efecto
lateral, que ms de un puntero quede "apuntando a una variable
inexistente"
2. Sean p, q variables de tipo puntero
Sea la situacin :

Notar la diferencia entre las dos asignaciones:
[1] p = q
[2] *p = *q
Luego de ejecutar [1], tenemos:

Luego de ejecutar [2], tenemos:

You might also like