1 Memoria estática versus dinámica con Estructuras
2 Memoria dinámica ¿Qué hacer cuando las variables declaradas soninsuficientes 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.
3 Memoria estática/dinámica 1struct 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; } Número de bytes que usa una variable de este tipo b x p a NULL
4 Memoria estática/dinámica 2struct 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; } b x p a NULL
5 Memoria estática/dinámica 3struct 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; } b NULL a x p
6 Memoria estática/dinámica 4struct 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; } b a 55 NULL x p
7 Memoria estática/dinámica 5struct 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; } b x p a 55 NULL x p
8 Memoria estática/dinámica 6struct 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; } b a 55 NULL x p x p
9 Memoria estática/dinámica 7struct 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; } b a 55 NULL 66 x p x p
10 Memoria estática/dinámica 8struct 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; } b a 121 NULL 66 x p x p
11 Memoria estática/dinámica 9struct 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; } b a 121 NULL 66 x p x p
12 Memoria estática/dinámica 10struct 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; } b NULL x p 66 a 55 x p
13 Memoria estática/dinámica 11struct 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 } b a 55 x p
14 Memoria dinámica 1 b NULL 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 NULL