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 usar asignación dinámica de memoria.
malloc()
Antes, para asignar memoria a nuestros datos, simplemente declararíamos:
Ahora, con la función malloc()
, podemos asignar memoria dinámicamente:
La función malloc()
requiere el número de bytes a asignar como su argumento. Si no estás seguro del tamaño en bytes necesario, pero conoces el tipo de datos a almacenar, puedes ajustar la expresión así:
¿Qué sigue?
Observa 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 casting 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 archivo de cabecera
stdlib.h
. Contiene el prototipo de la funciónmalloc()
.
Para almacenar datos en la dirección proporcionada por la función malloc()
, usamos el operador de desreferencia.
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 solo la memoria asignada por malloc()
y funciones similares.
free()
Esta función se utiliza con punteros. Para ilustrar, 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 "eliminar" un puntero, sigue siendo funcional, pero el valor almacenado en su ubicación de memoria asociada se vuelve confuso.
Esto lleva a un problema: una celda de memoria ocupada ahora contiene datos poco fiables. Para prevenir estos punteros, el puntero usado debe ser restablecido 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; }
Establecer 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.
Siempre verifica 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!