Contenido del Curso
Fundamentos de C
Fundamentos de C
Malloc y Free
Estas funciones nos permiten crear nuevos objetos no durante la compilación sino durante la ejecución del programa, permitiéndonos utilizar asignación dinámica de memoria.
malloc()
Antes, para asignar memoria a nuestros datos, simplemente declarábamos:
Ahora, con la función malloc()
, podemos asignar memoria dinámicamente:
La función malloc()
requiere el número de bytes a asignar como argumento. Si no estás seguro del tamaño de byte necesario, pero conoces el tipo de datos a almacenar, puedes ajustar la expresión de la siguiente manera:
¿Y ahora qué?
Fíjate en que estamos asignando el resultado de la función malloc()
a un puntero. ¡Esto significa que malloc()
devuelve una dirección!
El prefijo (int*)
es un cast explícito. Especificamos manualmente el tipo deseado. Por ejemplo:
Main
#include <stdio.h> #include <stdlib.h> // new header file! int main() { int* pX = (int*)malloc(sizeof(int)); printf("Address of allocated memory: %p\n", pX); return 0; }
Nota
Recuerda incluir el fichero de encabezado
stdlib.h
. Contiene el prototipo de la funciónmalloc()
.
Para almacenar datos en la dirección proporcionada por la función malloc()
, utilizamos el operador dereference.
Main
#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); return 0; }
¿Es posible liberar memoria? – Sí, pero sólo la memoria asignada por malloc()
y funciones similares.
free()
Esta función se utiliza con punteros. Para ilustrarlo, ampliemos el ejemplo anterior:
Main
#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf(" Value %d at address %p\n", *pX, pX); free(pX); printf("After `free()` value %d at address %p\n", *pX, pX); return 0; }
Curiosamente, incluso después de "borrar" un puntero, éste sigue siendo funcional, pero el valor almacenado en su posición de memoria asociada se desordena.
Esto conduce a un problema: una celda de memoria ocupada contiene ahora datos no fiables. Para evitar este tipo de punteros, el puntero utilizado debe ser reseteado a NULL
.
Main
#include <stdio.h> #include <stdlib.h> int main() { int* pX = (int*)malloc(sizeof(int)); *pX = 100; printf("Value %d at address %p\n", *pX, pX); free(pX); pX = NULL; return 0; }
Poner un puntero a NULL
después de liberar su memoria es una forma clara de indicar que el puntero ya no hace referencia a una ubicación de memoria válida.
Comprueba siempre si el puntero es NULL
antes de usarlo para asegurarte de que no estás accediendo a memoria inválida o ya asignada.
¡Gracias por tus comentarios!