Transcript
Page 1: Memoria  estática  versus  dinámica con Estructuras

Memoria estática versus

dinámicacon

Estructuras

Page 2: Memoria  estática  versus  dinámica con Estructuras

Memoria 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.

Page 3: Memoria  estática  versus  dinámica con Estructuras

Memoria estática/dinámica 1

struct str { int x; struct str *p;};main(){ struct str a; struct str *b=NULL; a.x=55; b=(struct str *)malloc(sizeof(struct str)); b->x=66; a.x=a.x+b->x;}

x pa

b

NULL

Número de bytes que usauna variable de este tipo

Page 4: Memoria  estática  versus  dinámica con Estructuras

Memoria 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 *b=NULL; a.x=55; b=(struct str *)malloc(sizeof(struct str)); b->x=66; a.x=a.x+b->x;}

x pa

b

NULL

Page 5: Memoria  estática  versus  dinámica con Estructuras

Memoria 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 *b=NULL; a.x=55; b=(struct str *)malloc(sizeof(struct str)); b->x=66; a.x=a.x+b->x;}

x pa

b

NULL

Page 6: Memoria  estática  versus  dinámica con Estructuras

Memoria estática/dinámica 4

struct str { int x; struct str *p;};main(){ struct str a; struct str *b=NULL;// 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.x=55; b=(struct str *)malloc(sizeof(struct str)); b->x=66; a.x=a.x+b->x;}

x pa

b

NULL55

Page 7: Memoria  estática  versus  dinámica con Estructuras

Memoria estática/dinámica 5

struct str { int x; struct str *p;};main(){ struct str a; struct str *b=NULL; a.x=55;// 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->x=66; a.x=a.x+b->x;}

x pa 55 x p

b

NULL

Page 8: Memoria  estática  versus  dinámica con Estructuras

b

NULL

Memoria estática/dinámica 6

struct str { int x; struct str *p;};main(){ struct str a; struct str *b=NULL; a.x=55;// 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->x=66; a.x=a.x+b->x;}

x pa 55 x p

Page 9: Memoria  estática  versus  dinámica con Estructuras

Memoria estática/dinámica 7

struct str { int x; struct str *p;};main(){ struct str a; struct str *b=NULL; a.x=55; b=(struct str *)malloc(sizeof(struct str));// para acceder a los campos de la variable estructurada se debe usar "->" // en vez de “.”: b->x=66; a.x=a.x+b->x;}

x pa

b

NULL55 x p66

Page 10: Memoria  estática  versus  dinámica con Estructuras

Memoria estática/dinámica 8

struct str { int x; struct str *p;};main(){ struct str a; struct str *b=NULL; a.x=55; b=(struct str *)malloc(sizeof(struct str));// para acceder a los campos de la variable estructurada se debe usar "->" // en vez de “.”: b->x=66; a.x=a.x+b->x;}

x pa

b

NULL121 x p66

Page 11: Memoria  estática  versus  dinámica con Estructuras

Memoria estática/dinámica 9

struct str { int x; struct str *p;};main(){ struct str a; struct str *b=NULL; a.x=55; b=(struct str *)malloc(sizeof(struct str)); b->x=66; a.x=a.x+b->x;// 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: b=&a;}

x pa NULL121 x p66

b

Page 12: Memoria  estática  versus  dinámica con Estructuras

struct str { int x; struct str *p;};main(){ struct str a; struct str *b=NULL; a.x=55; b=(struct str *)malloc(sizeof(struct str)); b->x=66; a.x=a.x+b->x;// la forma correcta es devolver dinamicamente la memoria: free(b); b=&a;}

x pa 55 NULLx p66

b

Memoria estática/dinámica 10

Page 13: Memoria  estática  versus  dinámica con Estructuras

struct str { int x; struct str *p;};main(){ struct str a; struct str *b=NULL; a.x=55; b=(struct str *)malloc(sizeof(struct str)); b->x=66; a.x=a.x+b->x;free(b); b=&a;// NO es necesario declarar una variable estructurada como “a” para formar una lista}

x pa 55

b

Memoria estática/dinámica 11

Page 14: Memoria  estática  versus  dinámica con Estructuras

struct str { int x; struct str *p;};main(){ struct str *b=NULL; …………

// 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}

b

Memoria dinámica 1

NULL


Recommended