Memoria Estatica (CallStack)
Memoria Dinamica (Heap)
Memoria estatica (Callstack) vs Memoria Dinamica (Heap)
Usos de Malloc y Free| FUNCION | USO |
|---|---|
| (tipo de dato)malloc(cantidad_de_memoria_que_ocupa); | Cuando queremos pedir memoria para un tipo de dato determinado |
| free(dato_a_liberar): | Cuando queremos liberar la memoria que habiamos pedido previamente con malloc. |
EjemploPidiendo memoria para un char * y liberandola
#include <stdlib.h>
int main()
{
int len_string = 10;
char *string_en_el_heap = (int *)malloc(len_string + 1);
if (!string_en_el_heap)
return (NULL); // si falla la asignacion de memoria en el heap
free(string_en_el_heap);
return 0;
}
Pidiendo memoria para un int * y liberandola
#include <stdlib.h>
int main()
{
int total_numbers = 20;
int *numeros_en_el_heap = (int *)malloc(sizeof(int) * total_numbers);
if (!numeros)
return (NULL); // si falla la asignacion de memoria en el heap
free(numeros_en_el_heap);
return 0;
}
Pidiendo memoria para un char ** y liberandola
#include <stdlib.h>
int main()
{
// pedimos memoria para los 3 punteros de los strings
unsigned int total_strings = 3;
char **pointer_to_strings = (char **)malloc(sizeof(char *) * total_strings);
if (!pointer_to_strings)
return (NULL);
// pedimos la memoria para cada string
unsigned int len_string_1 = 10;
char *string_1 = (char *)malloc(len_string_1 + 1);
if (!string_1)
{
free(pointer_to_strings);
return (NULL);
}
unsigned int len_string_2 = 8;
char *string_2 = (char *)malloc(len_string_2 + 1);
if (!string_2)
{
free(pointer_to_strings);
free(string_1);
return (NULL);
}
unsigned int len_string_3 = 5;
char *string_3 = (char *)malloc(len_string_3 + 1);
if (!string_3)
{
free(pointer_to_strings);
free(string_1);
free(string_2);
return (NULL);
}
// Cargamos la memoria pedida de cada string en el char **
pointer_to_strings[0] = string_1;
pointer_to_strings[1] = string_2;
pointer_to_strings[2] = string_3;
// liberamos la memoria
unsigned int i = 0;
while (i < total_strings)
{
free(pointer_to_strings[i]);
i++;
}
free(pointer_to_strings);
return 0;
}