Documente Academic
Documente Profesional
Documente Cultură
on
Universidad de M
alaga
LAGA
UNIVERSIDAD DE MA
Dpto. Lenguajes y CC. Computaci
on
E.T.S.I. Inform
atica
DE MEMORIA DINA
MICA
GESTION
Tema 2-Anexo
Programaci
on de Sistemas y Concurrencia
Programaci
on de Sistemas y Concurrencia
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA
Tema 3: GESTION
$
'
1. Introducci
on
&
2. El Tipo Puntero
3. Gesti
on de Memoria Din
amica
4. Operaciones con Punteros
5. Listas Enlazadas Lineales
6. Arrays y Punteros
7. Aritm
etica de Punteros
8. Arrays en Memoria Din
amica
9. Bibliografa
Programaci
on de Sistemas y Concurrencia
DE MEMORIA DINAMICA
Universidad de M
alaga
INTRODUCCION
Variables autom
aticas (gestionadas por el compilador)
La gesti
on de la Memoria Din
amica permite al programa gestionar el tiempo
de vida de las variables din
amicas y las necesidades de almacenamiento en
Tiempo de Ejecuci
on
Conlleva mayor complejidad en la programaci
on, ya que es el propio programador (introduciendo c
odigo software para ello) el que debe gestionar el
tiempo de vida y accesibilidad de cada variable din
amica
La memoria din
amica es un recurso a gestionar por el programador (especial
atenci
on a la p
erdida de recursos)
Programaci
on de Sistemas y Concurrencia
DE MEMORIA DINAMICA
Universidad de M
alaga
REAS DE MEMORIA
INTRODUCCION:
A
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA
Tema 3: GESTION
1. Introducci
on
$
'
2. El Tipo Puntero
&
3. Gesti
on de Memoria Din
amica
4. Operaciones con Punteros
5. Listas Enlazadas Lineales
6. Arrays y Punteros
7. Aritm
etica de Punteros
8. Arrays en Memoria Din
amica
9. Bibliografa
Programaci
on de Sistemas y Concurrencia
DE MEMORIA DINAMICA
Universidad de M
alaga
struct Pers {
// Tipo Pers
char nombre[10] ;
char telefono[10] ;
int edad ;
} ;
typedef struct Pers* PPers ; // Tipo Puntero a Pers
int main()
{
PInt p1 ;
PPers p2 = NULL;
p1:
p2:
&
int* p3;
struct Pers* p4 = NULL;
}
Programaci
on de Sistemas y Concurrencia
DE MEMORIA DINAMICA
Universidad de M
alaga
El operador de desreferenciaci
on (*) permite acceder al contenido almacenado
en la variable apuntada por un puntero.
No confundir con el operador binario de multiplicaci
on.
En las figuras, el crculo representa la direcci
on de memoria almacenada por una variable de tipo
puntero, y la flecha se
nala simb
olicamente a la variable apuntada.
int main()
{
int x = 3 ;
int* px = &x ;
*px = 5 ;
printf("%d %d\n", x, *px) ; // muestra 5 5
}
Programaci
on de Sistemas y Concurrencia
STACK
'
x:
px:
&
DE MEMORIA DINAMICA
Universidad de M
alaga
Gesti
on de la propia variable de tipo puntero.
N
otese que el tiempo de vida de las variables con NOMBRE es gestionado por el compilador.
Gesti
on de la variable din
amica apuntada por el puntero y su tiempo de vida
Reserva del espacio en memoria din
amica.
Acceso y manipulaci
on de la informaci
on almacenada en memoria din
amica.
Liberaci
on del espacio en memoria din
amica.
En las figuras, el crculo representa la direcci
on de memoria almacenada por una variable de tipo
puntero, y la flecha se
nala simb
olicamente a la variable din
amica an
onima apuntada.
STACK
'
HEAP
$
'
int main()
- 5
px:
{
int* px ;
// construcci
on autom
atica de la variable PX
px = malloc(sizeof(int)); // crea una variable an
onima de tipo int
*px = 5 ;
// modifica el valor de la variable an
onima
&
%
&
printf("%d\n", *px) ; // accede al valor de la variable an
onima
free(px) ;
// destruye la variable an
onima y libera su espacio de memoria
}
// destrucci
on autom
atica de la variable PX
Programaci
on de Sistemas y Concurrencia
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA
Tema 3: GESTION
1. Introducci
on
2. El Tipo Puntero
$
'
on de Memoria Din
amica
3. Gesti
&
Programaci
on de Sistemas y Concurrencia
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA (I)
GESTION
Creaci
on de variable an
onima: malloc(sizeof(tipo de la variable apuntada))
Aloja y reserva la zona de memoria din
amica necesaria
Devuelve la direcci
on de memoria donde se aloja la variable din
amica
Destrucci
on de variable an
onima: free seguido por la variable de tipo puntero que apunta
a la variable din
amica que se desea destruir
Atenci
on a la p
erdida de recursos de memoria din
amica
int main()
{
struct Pers* ptr ;
ptr = malloc(sizeof(struct Pers)) ;
// manipulaci
on ...
int main()
ptr:
{
struct Pers* ptr ;
ptr = malloc(sizeof(*ptr));
// manipulaci
on ...
ptr:
free(ptr) ;
}
Programaci
on de Sistemas y Concurrencia
free(ptr) ;
}
9
pepe
111
5
liberada
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA (II)
GESTION
La operaci
on free(ptr); destruye la variable din
amica (an
onima) apuntada
por la variable ptr.
La variable ptr es una variable con nombre, y por lo tanto su tiempo de vida
est
a gestionado por el compilador.
// creaci
on autom
atica de la variable PTR
ptr:
ptr:
ptr:
// manipulaci
on ...
free(ptr) ;
// destrucci
on de la variable din
amica (an
onima)
pepe
111
5
liberada
}
// destrucci
on autom
atica de la variable PTR
Programaci
on de Sistemas y Concurrencia
10
XX
ptr:
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA (III)
GESTION
Hay que prestar atenci
on a la p
erdida de recursos de memoria din
amica cuando
se destruye una variable de tipo puntero, ya que podra estar apuntando a una
variable din
amica an
onima v
alida (no destruida).
int main()
{
struct Pers* ptr ;
// creaci
on autom
atica de la variable PTR
ptr:
ptr:
// manipulaci
on ...
}
// destrucci
on autom
atica de la variable PTR
// p
erdida de la variable din
amica (an
onima)
XX
ptr:
pepe
111
5
pepe
111
5
perdida
Programaci
on de Sistemas y Concurrencia
11
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA
Tema 3: GESTION
1. Introducci
on
2. El Tipo Puntero
3. Gesti
on de Memoria Din
amica
$
'
Programaci
on de Sistemas y Concurrencia
12
DE MEMORIA DINAMICA
Universidad de M
alaga
(I)
OPERACIONES CON PUNTEROS: ASIGNACION
La constante NULL se puede asignar a cualquier variable de tipo puntero
El resultado de malloc se puede asignar a una variable puntero al tipo alojado
Las variables de tipo puntero al mismo tipo se pueden asignar entre ellas.
p1:
p2:
p3:
*
p1:
p2:
p3:
?
?
pepe
111
5
liberada
}
Programaci
on de Sistemas y Concurrencia
13
DE MEMORIA DINAMICA
Universidad de M
alaga
(II)
OPERACIONES CON PUNTEROS: ASIGNACION
El valor almacenado en el puntero anterior a la asignaci
on se pierde al asignar (copiar) un nuevo
valor.
Hay que prestar atenci
on a la p
erdida de recursos que pudiera producir si se realiza de forma
inadecuada. Por ejemplo:
Programaci
on de Sistemas y Concurrencia
p1:
p2:
pepe
111
5
p1:
p2:
pepe
111
5
@
@
R
@
juan
222
7
juan
222
7
perdida
14
DE MEMORIA DINAMICA
Universidad de M
alaga
(I)
OPERACIONES CON PUNTEROS: DESREFERENCIACION
Desreferenciaci
on: acceso a la variable din
amica apuntada
Operador (*): *ptr es la variable din
amica completa apuntada por ptr
Operador (->): ptr->nombre accede al campo de la variable apuntada por ptr
Desreferenciar un puntero con valor NULL produce un error en tiempo de ejecuci
on (aborta la ejecuci
on)
Desreferenciar un puntero con valor inespecificado produce un comportamiento
an
omalo en tiempo de ejecuci
on
int main()
{
struct Pers* ptr = malloc(sizeof(*ptr)) ;
int main()
{
struct Pers* ptr = malloc(sizeof(*ptr)) ;
strcpy((*ptr).nombre, "pepe") ;
strcpy((*ptr).telefono, "111") ;
(*ptr).edad = 5 ;
strcpy(ptr->nombre, "pepe") ;
strcpy(ptr->telefono, "111") ;
ptr->edad = 5 ;
free(ptr) ;
// libera el registro
// libera el registro
}
Programaci
on de Sistemas y Concurrencia
15
DE MEMORIA DINAMICA
Universidad de M
alaga
(II)
OPERACIONES CON PUNTEROS: DESREFERENCIACION
Cuando se asigna un valor a una variable, el nuevo valor se almacena en su zona de memoria
(caja) correspondiente.
Cuando se toma el valor de una variable, se toma el valor almacenado en la zona de memoria
(caja) correspondiente.
Si la variable ptr apunta a una variable din
amica de tipo Pers, entonces:
16
ptr:
dato:
pepe
111
5
pepe
111
5
DE MEMORIA DINAMICA
Universidad de M
alaga
Y PASO DE PARA
METROS
OPERACIONES: COMPARACION
Los punteros se pueden comparar por igualdad (==) y desigualdad (!=)
Comparaci
on de un puntero con la constante NULL
Comparaci
on entre punteros que apuntan al mismo tipo
Los punteros se pueden pasar como par
ametros por valor y su direcci
on
Programaci
on de Sistemas y Concurrencia
17
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA
Tema 3: GESTION
1. Introducci
on
2. El Tipo Puntero
3. Gesti
on de Memoria Din
amica
4. Operaciones con Punteros
$
'
6. Arrays y Punteros
7. Aritm
etica de Punteros
8. Arrays en Memoria Din
amica
9. Bibliografa
Programaci
on de Sistemas y Concurrencia
18
DE MEMORIA DINAMICA
Universidad de M
alaga
Una lista es una variable de tipo puntero que apunta a una variable din
amica,
donde un campo de enlace de la variable din
amica apunta a otra variable din
amica que a su vez apunta a otra, as hasta que en la
ultima, el campo de enlace
no apunta a nada (NULL)
lista:
Programaci
on de Sistemas y Concurrencia
111
19
222
333
DE MEMORIA DINAMICA
Universidad de M
alaga
p1:
111
222
333
Programaci
on de Sistemas y Concurrencia
111
222
333
20
DE MEMORIA DINAMICA
Universidad de M
alaga
111
222
333
La sentencia p1->sig = p2, almacena en la variable p1->sig (caja roja) el valor de p2 (circulo
verde), por lo que la variable p1->sig pasa a apuntar al tercer nodo.
lista:
p1:
p2:
Programaci
on de Sistemas y Concurrencia
111
AAU
222
333
21
DE MEMORIA DINAMICA
Universidad de M
alaga
111
222
333
Programaci
on de Sistemas y Concurrencia
111
AU
222
333
22
DE MEMORIA DINAMICA
Universidad de M
alaga
Programaci
on de Sistemas y Concurrencia
23
DE MEMORIA DINAMICA
Universidad de M
alaga
Programaci
on de Sistemas y Concurrencia
24
DE MEMORIA DINAMICA
Universidad de M
alaga
25
DE MEMORIA DINAMICA
Universidad de M
alaga
26
DE MEMORIA DINAMICA
Universidad de M
alaga
27
DE MEMORIA DINAMICA
Universidad de M
alaga
Programaci
on de Sistemas y Concurrencia
28
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA
Tema 3: GESTION
1. Introducci
on
2. El Tipo Puntero
3. Gesti
on de Memoria Din
amica
4. Operaciones con Punteros
5. Listas Enlazadas Lineales
$
'
6. Arrays y Punteros
&
7. Aritm
etica de Punteros
8. Arrays en Memoria Din
amica
9. Bibliografa
Programaci
on de Sistemas y Concurrencia
29
DE MEMORIA DINAMICA
Universidad de M
alaga
ARRAYS Y PUNTEROS
Siempre que se utiliza un array, se realiza una conversi
on autom
atica y se genera
un puntero a la direcci
on en memoria del primer elemento del array.
Programaci
on de Sistemas y Concurrencia
30
p
dat 0 1 2 3 4
q
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA
Tema 3: GESTION
1. Introducci
on
2. El Tipo Puntero
3. Gesti
on de Memoria Din
amica
4. Operaciones con Punteros
5. Listas Enlazadas Lineales
6. Arrays y Punteros
$
'
etica de Punteros
7. Aritm
&
Programaci
on de Sistemas y Concurrencia
31
DE MEMORIA DINAMICA
Universidad de M
alaga
TICA DE PUNTEROS
ARITME
Es posible utilizar aritm
etica de punteros, tanto para sumar (+) como para restar
(-) un n
umero entero a un puntero.
El resultado es un puntero a un objeto del mismo tipo, pero situado tantas
posiciones a la derecha o izquierda como indique el valor del n
umero entero
sumado o restado.
La siguiente tabla muestra algunas equivalencias entre operadores al tratar con
arim
etica de punteros.
++p
--p
p += n
p -= n
p[i]
Programaci
on de Sistemas y Concurrencia
p = p + 1
p = p - 1
p = p + n
p = p - n
*(p + i)
32
dat 5 1 9 7 4
p
q
r
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA
Tema 3: GESTION
1. Introducci
on
2. El Tipo Puntero
3. Gesti
on de Memoria Din
amica
4. Operaciones con Punteros
5. Listas Enlazadas Lineales
6. Arrays y Punteros
7. Aritm
etica de Punteros
$
'
amica
8. Arrays en Memoria Din
&
9. Bibliografa
Programaci
on de Sistemas y Concurrencia
33
DE MEMORIA DINAMICA
Universidad de M
alaga
MICA
ARRAYS EN MEMORIA DINA
void *malloc(size_t size): reserva un
area de size bytes en la zona de memoria din
amica (heap),
y devuelve un puntero a dicha
area reservada.
void *calloc(size_t nelms, size_t size): reserva (e inicializa a cero) un
area de memoria consecutiva en la zona de memoria din
amica (heap) para almacenar un array de nelms elementos
de tama
no size bytes cada uno, y devuelve un puntero a dicha
area reservada.
void *realloc(void *ptr, size_t size): cambia el tama
no del
area de memoria din
amica apuntado por ptr para que pase a ocupar un nuevo tama
no de size bytes, y devuelve un puntero
a la nueva
area reservada. Si el
area de memoria original puede ser expandida o contrada al
nuevo tama
no size, entonces se expande o contrae al nuevo tama
no, sin necesidad de copiar los
datos. Sin embargo, si el
area de memoria original no puede ser expandida, entonces se reserva
un nuevo
area de memoria, se copian los datos originales almacenados en el
area original, y se
libera el
area original. Finalmente se devuelve un puntero al
area reservada.
void free(void *ptr): libera el
area de memoria din
amica apuntada por ptr, que debe haber sido
reservada previamente mediante una invocaci
on a malloc, calloc o realloc.
int main()
{
int* p = malloc(3*sizeof(int)) ;
int* q = realloc(p, 5*sizeof(int));
if (q != NULL) {
p = q;
}
free(p);
}
Programaci
on de Sistemas y Concurrencia
int main()
{
int i = 0;
int* p = calloc(5, sizeof(int)) ;
for (int* q = p; q < p+5; ++q) {
*q = i++;
}
free(p);
}
34
0 1 2 3 4
DE MEMORIA DINAMICA
Universidad de M
alaga
DE MEMORIA DINA
MICA
Tema 3: GESTION
1. Introducci
on
2. El Tipo Puntero
3. Gesti
on de Memoria Din
amica
4. Operaciones con Punteros
5. Listas Enlazadas Lineales
6. Arrays y Punteros
7. Aritm
etica de Punteros
8. Arrays en Memoria Din
amica
$
'
9. Bibliografa
&
Programaci
on de Sistemas y Concurrencia
35
DE MEMORIA DINAMICA