El documento habla sobre la memoria dinámica en C. Explica que existen dos tipos de memoria: estática y dinámica. La estática es fija e invariable, mientras que la dinámica cambia de acuerdo al tamaño de las variables. También describe funciones como malloc(), calloc(), realloc() y free() que permiten asignar y liberar memoria dinámica en tiempo de ejecución.
1. MEMORIA DINAMICA EN C
Los programas necesitan memoria
para funcionar y almacenar los datos
2. 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
3. PILA Y HEAP
PILA Y MONTICULO
memoria
de aplicación
heap
Estructuras
de control
stack
heap
stack
heap
stack
heap
stack
LIFO
Libremente
4. ASIGNACION ESTATICA DE MEMORIA
int funcion(int a)int funcion(int a)
{{
float x[100]; //reserva 100float x[100]; //reserva 100
numeros para el arreglo xnumeros para el arreglo x
}}
6. 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 *p
p=(float *)malloc(400);p=(float *)malloc(400);
EjemploEjemplo
if ((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
7. CALLOC
Sutilmente parecida a mallocSutilmente parecida a malloc
Asignar memoria (bytes) e inicializaAsignar memoria (bytes) e inicializa
Definición formalDefinición formal
void *calloc(unsigned num_elementos, unsignedvoid *calloc(unsigned num_elementos, unsigned
tamaño)tamaño)
EjemploEjemplo
if ((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
8. REALLOC
Aumenta el espacio de memoria asignado inicialmenteAumenta el espacio de memoria asignado inicialmente
a una variable después de haber utilizado malloc oa una variable después de haber utilizado malloc o
calloccalloc
Definición formalDefinición formal
void *realloc(void *puntero_anterior, unsignedvoid *realloc(void *puntero_anterior, unsigned
tamaño)tamaño)
EjemploEjemplo
p=(float *) malloc(100*sizeof(float));p=(float *) malloc(100*sizeof(float));
if ((p=(float *)if ((p=(float *)
realloc(p,200*sizeof(float)))==null)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 perdidosi realloc retorna null hemos perdido
espacio de malloc o callocespacio de malloc o calloc
9. 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 liberarSe 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,
peropero no segura 100%,no segura 100%, por lo tanto se recomiendapor lo tanto se recomienda
10. 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);