Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf ·...
Transcript of Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf ·...
![Page 1: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/1.jpg)
1
TEM
A
Gestión Dinámica de Memoria
Dept. Ciencias de la Computación e I.A. Universidad de Granada
![Page 2: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/2.jpg)
Definición de Puntero
Un puntero es un dato que contiene una dirección de memoria
Nota: Existe una dirección de memoria especial que se representa por la constante NULL (definida en stdlib.h) y se emplea cuando queremos indicar que un puntero no apuntan a ninguna dirección.
![Page 3: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/3.jpg)
Declaración
<tipo> *<identificador>;
<tipo> indica el tipo de dato del objeto referenciado por el puntero.
<identificador> identificador de la variable de tipo puntero.
Ejemplos double *a; int *b; char *c;
![Page 4: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/4.jpg)
Consideraciones
El espacio de memoria reservado para a lmacenar un puntero es e l mismo independientemente del tipo de dato al que apunte: el espacio que ocupa una dirección de memoria.
Cuando se declara un puntero se reserva memoria para albergar una dirección de memoria, pero NO PARA ALMACENAR EL DATO AL QUE APUNTA EL PUNTERO.
![Page 5: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/5.jpg)
Operaciones Básicas (1)
Dirección: Operador & &<id> devuelve la dirección de memoria donde
comienza la variable <id>
El operador & se utiliza para asignar valores a datos de tipo puntero.
Ejemplo init i; int *ptr; … ptr=&i;
![Page 6: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/6.jpg)
Operaciones Básicas (2) Indirección: Operador * *<ptr> devuelve e l contenido de l objeto
referenciado por el puntero <ptr>
El operador * se utiliza para acceder a los objetos a los que apunta un puntero.
Ejemplo char c; char *ptr; … ptr=&i; *ptr= ‘A’; /*equivale a c=‘A’;*/
![Page 7: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/7.jpg)
Asignación
A un puntero se le puede asignar: una dirección de memoria concreta la dirección de una variable el contenido de otro puntero Ejemplo
char c; char *ptr1=NULL; char *ptr2=NULL; … ptr1 = &c; ptr2 = ptr1; ptr1=0x1F3CE00A;
Como cualquier variable, los punteros también debe ser inicializados para que tenga un valor conocido. Es una buena costrumbre inicializarlos con NULL.
![Page 8: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/8.jpg)
Ejemplo variables Referencia /*Intercambio de valores con punteros. Variables por
referencia*/
#include <stdio.h>
void cambia (int *a, int *b){ int aux; aux = *a; *a = *b; *b = aux; }
int main(){ int x=0,y=1; …
cambia(&x,&y); …
return 0; }
![Page 9: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/9.jpg)
Un Ejemplo (1) int main(){ int y=5; int z=3; int *nptr; int *mptr;
nptr=&y;
z=*nptr;
1007 ? mptr
1003 ? nptr
1002 3 z
1001 5 y
1007 ? mptr
1003 1001 nptr
1002 3 z
1001 5 y
1007 ? mptr
1003 ? nptr
1002 5 z
1001 5 y
![Page 10: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/10.jpg)
Un Ejemplo (2) *nptr= 7;
mptr=nptr;
mptr=*z;
1007 ? mptr
1003 1001 nptr
1002 5 z
1001 7 y
1007 1001 mptr
1003 1001 nptr
1002 5 z
1001 7 y
1007 1002 mptr
1003 1001 nptr
1002 5 z
1001 7 y
![Page 11: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/11.jpg)
Un Ejemplo (y 3) *mptr= *nptr;
y=(*nptr)+1;
return 0; }
1007 1002 mptr
1003 1001 nptr
1002 5 z
1001 8 y
1007 1002 mptr
1003 1001 nptr
1002 7 z
1001 7 y
![Page 12: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/12.jpg)
Errores Comunes (1) Asignar punteros de distinto tipo int a=10; int *ptri=NULL; double x=; doubles *ptrf=NULL; …
ptri= &a; ptrf= &x; ptrf=ptri; /*ERROR*/
Utilizar punteros no inicializados char *ptr; *ptr=‘a’; /*ERROR*/
![Page 13: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/13.jpg)
Errores Comunes (y 2)
Asignar valores a un puntero y no a la variables a la que apunta int n; int *ptr=&n; ptr= 9; /*ERROR*/
Intentar asignarle un valor al dato apuntado por un puntero NULL int *ptr=NULL; *ptr= 9; /*ERROR*/
![Page 14: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/14.jpg)
Correspondencia Punteros y Vectores
Cuando declaramos un vector: <tipo> <identificador>[dim];
en realidad: Reservamos memoria para almacenar <dim>
elementos de <tipo> Creamos el puntero <identificador> que
apunta a la primera posición de memoria reservada para almacenar componentes de un vector
Por tanto, el identificador del vector es un puntero.
![Page 15: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/15.jpg)
Memoria Dinámica
Liberación de memoria: función free Tr a s u t i l i z a r l a m e m o r i a r e s e r v a d a dinámicamente, hay que liberar el espacio reservado con la función free, al que se le pasa el puntero con la zona de memoria reservada.
Reserva de memoria: función malloc Para reservar memoria usaremos la función malloc que nos devuelve un puntero a la zona de memoria reservada cuyo tamaño se le indica como parámetro. Al reservar memoria puede que no quede espacio suficiente, en cuyo caso la sirección devuelta es NULL
free y malloc pertenecen a stdlib.h
![Page 16: Gestión Dinámica de Memoria - UGRflanagan.ugr.es/docencia/2010-2011/atdi/apuntes/Tema6.pdf · Memoria Dinámica Liberación de memoria: función free Tras utilizar la memoria reservada](https://reader034.fdocument.pub/reader034/viewer/2022052518/5f04cf507e708231d40fd155/html5/thumbnails/16.jpg)
Ejemplo: vector tamaño dinámico #include <stdio.h> #include <stdlib.h> … int main(){ int i, n; double *serie;
/*Leemos el tamaño del vector*/ printf(”Número de elemntos del vector:”);
scanf(“%d”,&n);
/*Creación del vector*/ serie=malloc(n*sizeof(double)); /*Manejo del vector*/ for (i=0; i<n; i++) serie[i]= i;
printf(”Media del vector=%lf\n”,media(serie,n));
/*Liberación de memoria*/ free(serie); return 0; }