Contenido del Curso
C Básico
C Básico
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 referencia 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!