Sunteți pe pagina 1din 36

Lenguajes y Ciencias de la Computaci

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

INTRODUCCION
Variables autom
aticas (gestionadas por el compilador)

Se definen mediante tipo y NOMBRE


Creaci
on autom
atica cuando la ejecuci
on entra en el
ambito de vida
Destrucci
on autom
atica cuando la ejecuci
on sale del
ambito de vida
Tiempo de vida asociado al
ambito de su declaraci
on
Capacidad de almacenamiento predeterminado en Tiempo de Compilaci
on
Variables din
amicas (gestionadas por el programador)

Se definen con tipo pero sin nombre, son ANONIMAS

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

REAS DE MEMORIA
INTRODUCCION:
A

reas de Memoria durante la ejecuci


A
on de un programa:

Memoria global (est


atica): almacena constantes y datos globales, con un tiempo de vida que coincide con el tiempo de
ejecuci
on del programa.
Memoria autom
atica (stackpila de ejecuci
on): almacena los
par
ametros y variables locales que se crean y destruyen durante
la invocaci
on a subprogramas. Gestionada autom
aticamente por
el compilador y el flujo de ejecuci
on del programa.
Memoria din
amica (heapmontculo): almacena datos cuyo
tiempo de vida est
a gestionado din
amicamente por el programador, y cuyo acceso se realiza a trav
es de punteros.
Programaci
on de Sistemas y Concurrencia

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

EL TIPO PUNTERO (I)


El tipo puntero es un tipo simple que permite a un determinado programa acceder a posiciones concretas de memoria. Representa una direcci
on de memoria
(equivalente a un n
umero).
Una variable de tipo puntero almacena una direcci
on de memoria, y apunta
(o referencia) a una entidad (variable) de un determinado tipo alojada en un
determinado espacio de la memoria (global, autom
atica, din
amica).
Para definir un tipo puntero, se debe especificar el tipo de la variable apuntada.
La constante NULL indica una direcci
on de memoria NULA. Permite especificar
que un puntero no apunta a nada (equivalente al n
umero 0).
STACK
'
typedef int* PInt ;

// Tipo Puntero a int

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

EL TIPO PUNTERO (II)


El operador ampersand (&) permite obtener la direcci
on de memoria donde se
almacena el contenido de una variable o par
ametro.
Una variable de tipo puntero puede apuntar (o referenciar) a una entidad (variable) que puede estar alojada en la memoria global, la memoria autom
atica o
la memoria din
amica.
El tiempo de vida y el acceso de las variables autom
aticas est
a gestionado por el compilador.
El tiempo de vida y el acceso de las variables din
amicas est
a gestionado por el programador.

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

EL TIPO PUNTERO (III)


La gesti
on de la memoria din
amica a trav
es de punteros implica:

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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
&

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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

Desaloja y libera la memoria din


amica reservada apuntada por el puntero
La variable puntero queda con valor inespecificado
Si la variable puntero tiene un valor NULL, entonces free no hace nada

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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.

La variable ptr se construye autom


aticamente cuando el flujo de ejecuci
on
alcanza el comienzo del
ambito en el que dicha variable es definida.
La variable ptr se destruye autom
aticamente cuando el flujo de ejecuci
on
alcanza el final del
ambito en el que dicha variable es definida.
int main()
{
struct Pers* ptr ;

// creaci
on autom
atica de la variable PTR

ptr = malloc(sizeof(*ptr)) ; // creaci


on de la variable din
amica

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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 = malloc(sizeof(*ptr)) ; // creaci


on de la variable din
amica

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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

12

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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.

Se asigna (copia) el valor del puntero (un n


umero que representa una direcci
on en memoria
donde est
a almacenada la variable an
onima). Por ejemplo la asignaci
on p1 = p2;
El valor de p2 (representado con un circulo de color verde) se copia a la variable p1
(representada con una caja de color azul).

Ambos punteros apuntar


an a la misma variable din
amica compartida
Atenci
on a la liberaci
on de la variable din
amica compartida
int main()
{
struct Pers *p1, *p2, *p3 ;
p1 = NULL ;
p2 = malloc(sizeof(struct Pers)) ;
// manipulacion ... "pepe", "111", 5
p1 = p2 ;
p3 = p2 ;
p3 = NULL ;
free(p1) ;

p1:
p2:
p3:

*

 


p1:
p2:
p3:

?
?


pepe
111
5

liberada

}
Programaci
on de Sistemas y Concurrencia

13

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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:

La primera figura es el resultado de la ejecuci


on del siguiente programa hasta la lnea 6
inclusive (suponemos que los valores de los campos se han asignado adecuadamente).
La segunda figura es el resultado de la ejecuci
on del siguiente programa hasta la lnea 7
inclusive.
Podemos apreciar como, despu
es de la asignaci
on de la lnea 7, se pierde la memoria de la
variable din
amica anteriormente apuntada por p2.
1 int main()
2 {
3
struct Pers *p1, *p2 ;
4
5
p1 = malloc(sizeof(struct Pers));
6
p2 = malloc(sizeof(*p2)) ;
7
p2 = p1 ;
8
free(p1) ;
9 }

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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 ;

struct Pers p = *ptr ; // Copia del registro


*ptr = p ;
// Copia del registro
free(ptr) ;

free(ptr) ;

// libera el registro

// libera el registro

}
Programaci
on de Sistemas y Concurrencia

15

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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:

La variable ptr contiene la direcci


on de memoria (un n
umero) donde se encuentra almacenada la variable din
amica. En la figura est
a representada por una caja en color azul.
La operaci
on *ptr se refiere a la variable din
amica (an
onima) completa apuntada por ptr.
En la figura est
a representada por una caja en color verde.
La operaci
on ptr->edad se refiere al campo edad de la variable din
amica (an
onima) apuntada
por ptr. En la figura est
a representada por una caja en color rojo.
int main()
{
struct Pers* ptr ;
ptr = malloc(sizeof(struct Pers)) ;
strcpy(ptr->nombre, "pepe") ;
strcpy(ptr->telefono, "111") ;
ptr->edad = 5 ;
struct Pers dato = *ptr ; // Copia del registro completo
free(ptr) ;
// libera el registro
}
Programaci
on de Sistemas y Concurrencia

16

ptr:

dato:

pepe
111
5

pepe
111
5

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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

Los punteros son tipos simples


Las funciones pueden devolver punteros
int main()
{
struct
// ...
if (p1
//
}
if (p1
//
}
}

void crear(struct Pers** p)


struct Pers* crear() ;
{
{
Pers *p1, *p2 ;
*p = malloc(sizeof(*p)) ;
struct Pers* p = malloc(sizeof(*p)) ;
strcpy((*p)->nombre, "pepe") ;
strcpy(p->nombre, "pepe") ;
!= NULL) {
strcpy((*p)->telefono, "111") ;
strcpy(p->telefono, "111") ;
...
(*p)->edad = 5 ;
p->edad = 5 ;
}
return p;
== p2) {
void modificar(struct Pers* p)
}
...
{
strcpy(p->nombre, "juan") ;
}

Programaci
on de Sistemas y Concurrencia

17

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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

18

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

LISTAS ENLAZADAS LINEALES (I)


Permiten almacenar en memoria din
amica secuencias de un n
umero inespecificado de elementos homog
eneos
Estructuras enlazadas: un campo de enlace del tipo de la variable din
amica es
de tipo puntero al mismo tipo de la variable din
amica
typedef struct Nodo* PNodo ; // Definici
on de tipo Puntero a tipo incompleto Nodo
struct Nodo {
// Definici
on del tipo Nodo
PNodo sig ;
// Enlace a la siguiente estructura din
amica
int dato ;
// Dato almacenado en la lista (cualquier tipo)
} ;

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

LISTAS ENLAZADAS LINEALES (II)


En el trabajo con listas enlazadas, es importante tener claro los conceptos de asignaci
on y de
desreferenciaci
on.
Si la variable p1 apunta a una variable din
amica de tipo Nodo, entonces:

La variable p1 contiene la direcci


on de memoria (un n
umero) donde se encuentra almacenada
la variable din
amica. En la figura est
a representada por una caja en color azul.
La operaci
on p1->sig se refiere al campo sig de la variable din
amica (an
onima) apuntada
por p1. En la figura est
a representada por una caja en color rojo.
lista:

p1:





111

222


333

La sentencia p1 = p1->sig, almacena en la variable p1 (caja azul) el valor de p1->sig (circulo


rojo), por lo que la variable p1 pasa a apuntar al siguiente nodo.
lista:
p1:

Programaci
on de Sistemas y Concurrencia


111

222


333




20

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

LISTAS ENLAZADAS LINEALES (III)


En el trabajo con listas enlazadas, es importante tener claro los conceptos de asignaci
on y de
desreferenciaci
on.
Si las variables p1 y p2 apuntan a variables din
amicas de tipo Nodo, entonces:

La variable p1 contiene la direcci


on de memoria (un n
umero) donde se encuentra almacenada
la variable din
amica. En la figura est
a representada por una caja en color azul.
La operaci
on p1->sig se refiere al campo sig de la variable din
amica (an
onima) apuntada
por p1. En la figura est
a representada por una caja en color rojo.
La variable p2 contiene la direcci
on de memoria (un n
umero) donde se encuentra almacenada
la variable din
amica. En la figura est
a representada por una caja en color verde.
lista:
p1:
p2:





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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

LISTAS ENLAZADAS LINEALES (IV)


En el trabajo con listas enlazadas, es importante tener claro los conceptos de asignaci
on y de
desreferenciaci
on.
Si las variables p1 y p2 apuntan a variables din
amicas de tipo Nodo, entonces:

Las variables p1 y p2 contienen las direcciones de memoria (unos n


umeros) donde se encuentran almacenadas las variables din
amicas apuntadas.
La operaci
on p1->sig se refiere al campo sig de la variable din
amica (an
onima) apuntada
por p1. En la figura est
a representada por una caja en color rojo.
La operaci
on p2->sig se refiere al campo sig de la variable din
amica (an
onima) apuntada
por p2. En la figura est
a representada por una caja en color verde.
lista:
p1:
p2:





111


222


333





La sentencia p1->sig = p2->sig, almacena en la variable p1->sig (caja roja) el valor de


p2->sig (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





AU

222


333

22

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

LISTAS ENLAZADAS LINEALES. OPERACIONES (I)


PNodo leer_inversa()
{
PNodo lista = NULL ;
int dt ;
scanf(" %d", &dt) ;
while (dt != 0) {
PNodo ptr = malloc(sizeof(*ptr)) ;
ptr->dato = dt ;
ptr->sig = lista ;
lista = ptr ;
scanf(" %d", &dt) ;
}
return lista ;
}
int main()
{
PNodo lista ;
lista = leer_inversa() ;
mostrar(lista) ;
PNodo ptr = buscar(lista, 5) ;
if (ptr != NULL) {
printf("%d\n", ptr->dato) ;
}
destruir(lista) ;
}

void mostrar(PNodo lista)


{
PNodo ptr = lista ;
while (ptr != NULL) {
printf("%d\n", ptr->dato) ;
ptr = ptr->sig ;
}
}
PNodo buscar(PNodo lista, int dt)
{
PNodo ptr = lista ;
while ((ptr != NULL)&&(ptr->dato != dt)) {
ptr = ptr->sig ;
}
return ptr ;
}
void destruir(PNodo* lista)
{
while (*lista != NULL) {
PNodo ptr = *lista ;
*lista = (*lista)->sig ;
free(ptr) ;
}
}

Programaci
on de Sistemas y Concurrencia

23

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

LISTAS ENLAZADAS LINEALES. OPERACIONES (II)


void insertar_principio(PNodo* lista, int dt)
{
PNodo ptr = malloc(sizeof(*ptr)) ;
ptr->dato = dt ;
ptr->sig = *lista ;
*lista = ptr ;
}

void insertar_ord(PNodo* lista, int dt)


{
PNodo ptr = malloc(sizeof(*ptr)) ;
ptr->dato = dt ;
if ((*lista == NULL)||(dt < (*lista)->dato)) {
ptr->sig = *lista ;
*lista = ptr ;
} else {
PNodo ant = *lista ;
PNodo act = ant->sig ;
while ((act!=NULL)&&(act->dato<=dt)) {
ant = act ;
act = act->sig ;
}
ptr->sig = ant->sig ;
ant->sig = ptr ;
}
}

void insertar_final(PNodo* lista, int dt)


{
PNodo ptr = malloc(sizeof(*ptr)) ;
ptr->dato = dt ;
ptr->sig = NULL ;
if (*lista == NULL) {
*lista = ptr ;
} else {
PNodo act = *lista ;
while (act->sig != NULL) {
act = act->sig ;
}
act->sig = ptr ;
}
}

Programaci
on de Sistemas y Concurrencia

24

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

LISTAS ENLAZADAS LINEALES. OPERACIONES (III)


void eliminar_primero(PNodo* lista)
{
if (*lista != NULL) {
PNodo ptr = *lista ;
*lista = (*lista)->sig ;
free(ptr) ;
}
}

void eliminar_elem(PNodo* lista, int dt)


{
if (*lista != NULL) {
if ((*lista)->dato == dt) {
PNodo ptr = *lista ;
*lista = *lista->sig ;
free(ptr) ;
} else {
PNodo ant = *lista ;
PNodo act = ant->sig ;
while ((act != NULL)&&(act->dato != dt)) {
ant = act ;
act = act->sig ;
}
if (act != NULL) {
ant->sig = act->sig ;
free(act) ;
}
}
}
}

void eliminar_ultimo(PNodo* lista)


{
if (*lista != NULL) {
if ((*lista)->sig == NULL) {
free(*lista) ;
*lista = NULL ;
} else {
PNodo ant = *lista ;
PNodo act = ant->sig ;
while (act->sig != NULL) {
ant = act ;
act = act->sig ;
}
free(act) ;
ant->sig = NULL ;
}
}
}
Programaci
on de Sistemas y Concurrencia

25

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

LISTAS ENLAZADAS LINEALES. OPERACIONES (IV)


PNodo situar(PNodo lista, int pos)
{
PNodo ptr = lista;
while ((ptr != NULL)&&(pos > 0)) {
ptr = ptr->sig;
--pos;
}
return ptr;
}

void eliminar_pos(PNodo* lista, int pos)


{
if (*lista != NULL) {
if (pos < 1) {
PNodo ptr = *lista ;
void insertar_pos(PNodo* lista, int pos, int dt)
*lista = (*lista)->sig ;
{
free(ptr) ;
if (pos < 1) {
} else {
PNodo ptr = malloc(sizeof(*ptr)) ;
PNodo ant = situar(*lista, pos - 1) ;
ptr->dato = dt ;
if ((ant != NULL)&&(ant->sig != NULL)) {
ptr->sig = *lista ;
PNodo act = ant->sig ;
*lista = ptr ;
ant->sig = act->sig ;
} else {
free(act) ;
PNodo ant = situar(*lista, pos - 1);
}
if (ant != NULL) {
}
PNodo ptr = malloc(sizeof(*ptr)) ;
}
ptr->dato = dt ;
}
ptr->sig = ant->sig ;
ant->sig = ptr ;
}
}
}
Programaci
on de Sistemas y Concurrencia

26

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

LISTAS ENLAZADAS LINEALES. OPERACIONES (V)


void insertar_ultimo(PNodo* lista, PNodo* ult,
int dt)
{
PNodo p = malloc(sizeof(*p)) ;
p->dato = dt ;
p->sig = NULL ;
if (*lista == NULL) {
*lista = p ;
} else {
(*ult)->sig = p ;
}
*ult = p ;
}
PNodo leer()
{
PNodo lista = NULL ;
PNodo ult = NULL ;
int dt ;
scanf(" %d", &dt) ;
while (dt != 0) {
insertar_ultimo(&lista, &ult, dt) ;
scanf(" %d", &dt) ;
}
return lista;
}
Programaci
on de Sistemas y Concurrencia

PNodo duplicar(PNodo lista)


{
PNodo nueva = NULL;
if (lista != NULL) {
nueva = malloc(sizeof(struct Nodo)) ;
nueva->dato = lista->dato ;
PNodo u = nueva ;
PNodo p = lista->sig ;
while (p != NULL) {
u->sig = malloc(sizeof(struct Nodo)) ;
u->sig->dato = p->dato ;
u = u->sig ;
p = p->sig ;
}
u->sig = NULL ;
}
return nueva;
}

27

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

Universidad de M
alaga

LISTAS ENLAZADAS LINEALES. OPERACIONES (VI)


void eliminar_mayor(PNodo* lista)
{
if (*lista != NULL) {
PNodo ant_may = NULL ;
PNodo ptr_may = *lista ;
PNodo ant = *lista ;
PNodo ptr = (*lista)->sig ;
while (ptr != NULL) {
if (ptr->dato > ptr_may->dato) {
ant_may = ant ;
ptr_may = ptr ;
}
ant = ptr ;
ptr = ptr->sig ;
}
if (ptr_may == *lista) {
*lista = (*lista)->sig;
} else {
ant_may->sig = ptr_may->sig;
}
free(ptr_may);
}
}

Programaci
on de Sistemas y Concurrencia

void purgar(PNodo* lista, int dt)


{
while ((*lista!=NULL)&&(dt == (*lista)->dato)) {
PNodo ptr = *lista;
*lista = (*lista)->sig;
free(ptr);
}
if (*lista != NULL) {
PNodo ant = *lista;
PNodo act = (*lista)->sig;
while (act != NULL) {
if (dt == act->dato) {
ant->sig = act->sig;
free(act);
} else {
ant = act;
}
act = ant->sig;
}
}
}

28

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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.

Cuando los arrays se pasan como par


ametros a un subprograma, se produce
una conversi
on autom
atica, y lo que realmente se pasa es un puntero al
primer elemento del array.
Del mismo modo, cuando se asigna un array a un puntero, se produce una
conversi
on autom
atica y se asigna un puntero al primer elemento del array.
Es importante resaltar que esta conversi
on autom
atica de array a puntero no
significa que arrays y punteros sean lo mismo, son conceptos y estructuras
diferentes.
typedef int Datos[5] ;
int main()
{
Datos dat = { 0, 1, 2, 3, 4 } ;
int* p = dat ;
int* q = &dat[0] ;
}

Programaci
on de Sistemas y Concurrencia

30

p
dat 0 1 2 3 4
q

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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
&

8. Arrays en Memoria Din


amica
9. Bibliografa

Programaci
on de Sistemas y Concurrencia

31

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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)

typedef int Datos[5] ;


int main()
{
Datos dat = { 0, 1, 2, 3, 4 } ;
int* p = dat ;
int* q = p + 3 ;
int* r = q - 1 ;
*p = 5 ;
*q = 7 ;
*r = 9 ;
}

32

dat 5 1 9 7 4
p
q
r

DE MEMORIA DINAMICA

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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

Tema 2-Anexo: GESTION

Lenguajes y Ciencias de la Computaci


on

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

Tema 2-Anexo: GESTION

S-ar putea să vă placă și