4 memoria dinamica

10
MEMORIA DINAMICA EN C Los programas necesitan memoria para funcionar y almacenar los datos

Transcript of 4 memoria dinamica

Page 1: 4 memoria dinamica

MEMORIA DINAMICA EN C

Los programas necesitan memoria para funcionar y almacenar los datos

Page 2: 4 memoria dinamica

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

Page 3: 4 memoria dinamica

PILA Y HEAP

PILA Y MONTICULO

memoria

de aplicación

heap

Estructuras de control

stack

heap

stack

heap

stack

heap

stack

LIFO

Libremente

Page 4: 4 memoria dinamica

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

}}

Page 5: 4 memoria dinamica

FUNCIONES PARA ASIGNACION

stdlib.h MALLOC CALLOC REALLOC FREE

Page 6: 4 memoria dinamica

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

Page 7: 4 memoria dinamica

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

Page 8: 4 memoria dinamica

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

Page 9: 4 memoria dinamica

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

Page 10: 4 memoria dinamica

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);