Presentación de PowerPoint - Vanessa Borjas

Anuncio
ASIGNACIÓN DINÁMICA
DE MEMORIA
Algoritmos, Estructuras y Programación II
Variables
VARIABLES
GLOBALES
• Posiciones fijas de
memoria.
• Zona: segmento de
datos.
• Todas las funciones
pueden utilizarlas.
VARIABLES LOCALES
• Se almacenan en la
pila (stack).
• Existen solo mientras
están activas las
funciones que están
declaradas.
Se definen cuando se compila el programa.
El compilador reserva (define) espacio para almacenar
valores de los tipos de datos declarados.
Espacio de almacenamiento
• El espacio de almacenamiento se reserva en el momento
de la compilación.
• Sin embargo, no siempre es posible conocer con
antelación a la ejecución cuánta memoria se debe
reservar al programa.
• En C, se asigna memoria en el momento de la ejecución
en el montículo o montón (heap).
Asignación dinámica de memoria
• El espacio de la variable asignada dinámicamente se
crea durante la ejecución del programa, al contrario que
en el caso de una variable local, cuyo espacio se asigna
en tiempo de compilación.
• Proporciona control directo sobre los requisitos de
memoria de su programa.
• El programa puede crear o destruir la asignación
dinámica en cualquier momento durante la ejecución.
Asignación dinámica de memoria
• Programa compilado  Segmentos de memoria
denominados segmentos de código.
• Datos del programa, como variables globales 
Segmento de datos.
• Variables locales e información de control del programa
 pila.
La memoria que queda se denomina memoria del
montículo o almacén libre. Cuando el programa solicita
memoria para una variable dinámica, se asigna es
espacio de memoria deseado desde el montículo.
Memoria dinámica
• Las variables y vectores en C ocupan un tamaño
prefijado, no pueden variarlo durante la ejecución del
programa.
• Por medio de punteros se puede reservar o liberar
memoria dinámicamente, es decir, según se necesite.
Para ello existen varias funciones estándares de la
biblioteca <stdlib.h>
Función malloc
• Sirve para solicitar un bloque de memoria del tamaño
(bytes) suministrado como parámetro.
• Devuelve un puntero a la zona de memoria concedida.
Void * malloc(unsigned numero_de_bytes);
• El puntero se utiliza para referenciar el bloque de
memoria y devuelve un puntero del tipo void *.
• La función malloc está declarada en el archivo de
cabecera stdlib.h.
Función malloc
La forma de llamar a la función malloc() es:
puntero = malloc(tamaño en bytes)
Generalmente, se hará una conversión al tipo de puntero:
tipo * puntero;
puntero = (tipo *)malloc(tamaño en bytes);
Ejemplo:
int *p;
p = (int *)malloc(4)
Función malloc
• El tamaño se especifica en bytes. Se
garantiza que la zona de memoria
concedida no está ocupada por ninguna
otra variable ni otra zona devuelta por
malloc.
• Si malloc es incapaz de conceder el
bloque (por ejemplo, si no hay memoria
suficiente), devuelve un puntero nulo.
Punteros void *
• La función malloc devuelve un puntero inespecífico, que
no apunta a ningún tipo de datos determinado. En C,
estos punteros sin tipo se declaran como void*
• Muchas funciones que devuelven direcciones de memoria
utilizan los punteros void*. Un puntero void* puede
convertirse a cualquier otra clase de puntero:
char* ptr = (char*)malloc(1000);
Operador sizeof
• El problema de malloc es conocer cuántos bytes se
quieren reservar. Si se quiere reservar una zona para
diez enteros, habrá que multiplicar diez por el tamaño de
un entero.
• El tamaño en bytes de un elemento de tipo T se obtiene
con la expresión:
sizeof( T)
• El tamaño de un char siempre es 1 (uno).
Operador sizeof
• El operador unario sizeof se utiliza con mucha frecuencia
en las funciones de asignación de memoria. El operador
se aplica a un tipo de dato (o una variable), el valor
resultante es el número de bytes que ocupa.
• Así, si se quiere reservar memoria para un buffer de 10
enteros:
int *r;
r = (int *)malloc(10*sizeof(int));
Función free
• Cuando una zona de memoria reservada con malloc ya
no se necesita, puede ser liberada mediante la
función free.
void free (void* ptr);
• ptr es un puntero de cualquier tipo que apunta a un área
de memoria reservada previamente con malloc.
• Si ptr apunta a una zona de memoria indebida, los
efectos pueden ser desastrosos, igual que si se libera dos
veces la misma zona.
Ejemplo
Fuentes:
• http://kesquivel.files.wordpress.com/2011/03/asignaciondinamicamemoria_20
11.pdf
• http://sopa.dis.ulpgc.es/so/cpp/intro_c/introc75.htm
• http://kesquivel.files.wordpress.com/2010/08/ejerciciospunteros_pestr.pdf
Descargar