memoria estática versus dinámica con estructuras

Post on 03-Jan-2016

33 Views

Category:

Documents

3 Downloads

Preview:

Click to see full reader

DESCRIPTION

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. - PowerPoint PPT Presentation

TRANSCRIPT

Memoria estática versus

dinámicacon

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.

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

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

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

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

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

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

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

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

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

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

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

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

top related