Title: Memoria est
1Memoria estática versus dinámicaconEstructuras
2Memoria dinámica
Qué hacer cuando las variables declaradas son
insuficientes o cuando no se conoce
anticipadamente cuanto almacenamiento será
requerido por el programa?
1. Se crea una variable de tipo puntero. 2. Se le
pide al sistema operativo que asigne más
memoria. 3. El sistema operativo retorna la
dirección a la memoria asignada. 4. Si la
memoria asignada, no se usará más, se puede
devolver al sistema operativo.
3Memoria estática/dinámica 1
struct str int x struct str
p main() struct str a struct str
bNULL a.x55 b(struct str
)malloc(sizeof(struct str)) b-gtx66
a.xa.xb-gtx
Número de bytes que usa una variable de este tipo
b
NULL
4Memoria estática/dinámica 2
struct str int x struct str
p main() // se crea la variable
estructurada estatica, "a" que tiene memoria
asignada, // la relacion entre el nombre "a" y la
memoria asignada es permanente struct str a
struct str bNULL a.x55 b(struct str
)malloc(sizeof(struct str)) b-gtx66
a.xa.xb-gtx
b
NULL
5Memoria estática/dinámica 3
struct str int x struct str
p main() struct str a // se crea la
variable de tipo puntero "b" para apuntar a
variables estructuradas, // no hay memoria
asignada de tipo estructurada, "b" apunta a
nada struct str bNULL a.x55 b(struct
str )malloc(sizeof(struct str)) b-gtx66
a.xa.xb-gtx
a
x
p
6Memoria estática/dinámica 4
struct str int x struct str
p main() struct str a struct str
bNULL // se puede modificar u obtener el
contenido de los campos de la variable "a", //
para ello se debe usar "." seguida del nombre del
campo a.x55 b(struct str
)malloc(sizeof(struct str)) b-gtx66
a.xa.xb-gtx
b
NULL
a
55
x
p
7Memoria estática/dinámica 5
struct str int x struct str
p main() struct str a struct str
bNULL a.x55 // se pide, al sistema
operativo, memoria para una variable
estructurada, // la variable puntero "b" es usada
para almacenar la direccion de la nueva //
memoria devuelta, esto significa que b queda
apuntando a esta nueva // variable estructurada
b(struct str )malloc(sizeof(struct str))
b-gtx66 a.xa.xb-gtx
b
NULL
a
55
x
p
8Memoria estática/dinámica 6
struct str int x struct str
p main() struct str a struct str
bNULL a.x55 // se pide, al sistema
operativo, memoria para una variable
estructurada, // la variable puntero "b" es usada
para almacenar la direccion de la nueva //
memoria devuelta, esto significa que b queda
apuntando a esta nueva // variable estructurada
b(struct str )malloc(sizeof(struct str))
b-gtx66 a.xa.xb-gtx
b
NULL
a
55
x
p
9Memoria estática/dinámica 7
struct str int x struct str
p main() struct str a struct str
bNULL a.x55 b(struct str
)malloc(sizeof(struct str)) // para acceder a
los campos de la variable estructurada se debe
usar "-gt" // en vez de . b-gtx66
a.xa.xb-gtx
b
NULL
a
55
66
x
p
x
p
10Memoria estática/dinámica 8
struct str int x struct str
p main() struct str a struct str
bNULL a.x55 b(struct str
)malloc(sizeof(struct str)) // para acceder a
los campos de la variable estructurada se debe
usar "-gt" // en vez de . b-gtx66
a.xa.xb-gtx
b
NULL
a
121
66
x
p
x
p
11Memoria estática/dinámica 9
struct str int x struct str
p main() struct str a struct str
bNULL a.x55 b(struct str
)malloc(sizeof(struct str)) b-gtx66
a.xa.xb-gtx // si la variable de tipo puntero
se hace apuntar a otra variable estructurada //
por ejemplo a "a", la variable estructurada,
pedida en forma dinamica, // queda sin la
posibilidad de ser usada por el programa
ba
b
NULL
a
121
66
x
p
x
p
12Memoria estática/dinámica 10
struct str int x struct str
p main() struct str a struct str
bNULL a.x55 b(struct str
)malloc(sizeof(struct str)) b-gtx66
a.xa.xb-gtx // la forma correcta es devolver
dinamicamente la memoria free(b) ba
b
a
55
x
p
13Memoria estática/dinámica 11
struct str int x struct str
p main() struct str a struct str
bNULL a.x55 b(struct str
)malloc(sizeof(struct str)) b-gtx66
a.xa.xb-gtx free(b) ba // NO es necesario
declarar una variable estructurada como a para
formar una lista
a
55
x
p
14Memoria dinámica 1
struct str int x struct str
p main() struct str bNULL
// BASTA con declarar una variable tipo
puntero a estructur como b y usar malloc y
free // si el puntero tiene asignado el valor
NULL, se dice que apunta a NULL (nada) // si el
valor del puntero es NULL, se dice que la lista
está vacía
NULL