4 memoria dinamica
-
Upload
pedro-contreras-flores -
Category
Technology
-
view
6 -
download
0
Transcript of 4 memoria dinamica
MEMORIA DINAMICA EN C
Los programas necesitan memoria para funcionar y almacenar los datos
TIPOS DE MEMORIA
ESTATICA Fija, invariable al ejecutar el programa
DINAMICA Cambia de acuerdo al tamaño de
variables PROBLEMAS DE MEMORIA ESTATICA
int arreglo[100];int arreglo[100];
asignadoutilizado desuso
PILA Y HEAP
PILA Y MONTICULO
memoria
de aplicación
heap
Estructuras de control
stack
heap
stack
heap
stack
heap
stack
LIFO
Libremente
ASIGNACION ESTATICA DE MEMORIA
int funcion(int a)int funcion(int a)
{{
float x[100]; //reserva 100 float x[100]; //reserva 100 numeros para el arreglo xnumeros para el arreglo x
}}
FUNCIONES PARA ASIGNACION
stdlib.h MALLOC CALLOC REALLOC FREE
MALLOC
Asignar memoria en bytesAsignar memoria en bytes Definición formalDefinición formal
void *malloc(unsigned tamaño)void *malloc(unsigned tamaño) Conversión de tipoConversión de tipo
float *pfloat *pp=(float *)malloc(400);p=(float *)malloc(400);
EjemploEjemploif ((p=(float *) malloc(100*sizeof(float)))==NULL)if ((p=(float *) malloc(100*sizeof(float)))==NULL){{printf(“no hay memoria suficiente.\n ”);printf(“no hay memoria suficiente.\n ”);exit(1);exit(1);} }
Elimina riesgos de bloque del computadorElimina riesgos de bloque del computador
CALLOC
Sutilmente parecida a mallocSutilmente parecida a malloc Asignar memoria (bytes) e inicializa Asignar memoria (bytes) e inicializa Definición formalDefinición formal
void *calloc(unsigned num_elementos, unsigned void *calloc(unsigned num_elementos, unsigned tamaño)tamaño)
EjemploEjemploif ((p=(float *) calloc(100,sizeof(float)))==null)if ((p=(float *) calloc(100,sizeof(float)))==null){{printf(“no hay memoria suficiente.\n ”);printf(“no hay memoria suficiente.\n ”);exit(1);exit(1);} }
Apariencia más estructuradaApariencia más estructurada Si necesitamos espacio de memoria limpio al crearSi necesitamos espacio de memoria limpio al crear Elimina riesgos de bloque del computadorElimina riesgos de bloque del computador
REALLOC
Aumenta el espacio de memoria asignado inicialmente a Aumenta el espacio de memoria asignado inicialmente a una variable después de haber utilizado malloc o una variable después de haber utilizado malloc o calloccalloc
Definición formalDefinición formalvoid *realloc(void *puntero_anterior, unsigned void *realloc(void *puntero_anterior, unsigned tamaño)tamaño)
EjemploEjemplop=(float *) malloc(100*sizeof(float));p=(float *) malloc(100*sizeof(float));if ((p=(float *) realloc(p,200*sizeof(float)))==null)if ((p=(float *) realloc(p,200*sizeof(float)))==null){{printf(“no hay memoria suficiente.\n ”);printf(“no hay memoria suficiente.\n ”);exit(1);exit(1);} }
Cuidado: Cuidado: si realloc retorna null hemos perdido si realloc retorna null hemos perdido espacio de malloc o callocespacio de malloc o calloc
FREE
Libera memoria asignada con calloc, malloc, reallocLibera memoria asignada con calloc, malloc, realloc No devuelve valor y recibe punteroNo devuelve valor y recibe puntero Definición formalDefinición formal
void free(void *puntero)void free(void *puntero) EjemploEjemplo
p=(float *) malloc(100*sizeof(float));p=(float *) malloc(100*sizeof(float));free(p);free(p);
Se recomienda utilizarla al final para liberar Se recomienda utilizarla al final para liberar memoria asignadamemoria asignada
Al cerrar el programa hay liberación automática, Al cerrar el programa hay liberación automática, pero pero no segura 100%, no segura 100%, por lo tanto se recomiendapor lo tanto se recomienda
Ejemplo 1
#include <stdlib.h>
int* ptr; /* puntero a enteros */int* ptr2; /* otro puntero */
...
/* reserva espacio para 300 enteros */ptr = (int*)malloc ( 300*sizeof(int) );... ptr[33] = 15; /* trabaja con el área de memoria */
rellena_de_ceros (10,ptr); /* otro ejemplo */
ptr2 = ptr + 15; /* asignación a otro puntero */
/* finalmente, libera la zona de memoria */free(ptr);