Malloc y Free
Estas funciones nos permiten crear nuevos objetos no durante la compilación, sino durante la ejecución del programa, lo que posibilita el uso de asignación dinámica de memoria.
malloc()
Anteriormente, para asignar memoria a nuestros datos, simplemente declaramos:
int x;
Ahora, con la función malloc(), podemos asignar memoria de forma dinámica:
int* pX = (int*)malloc(4);
La función malloc() requiere como argumento la cantidad de bytes a asignar. Si no se conoce el tamaño en bytes necesario, pero sí el tipo de dato a almacenar, se puede ajustar la expresión de la siguiente manera:
int* pX = (int*)malloc(sizeof(int));
¿Qué sigue?
Observe 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 una conversión explícita. Especificamos manualmente el tipo deseado. Por ejemplo:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#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
Recordar 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(), se utiliza el operador de desreferenciación.
Main.c
123456789101112#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.c
1234567891011121314151617#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, este sigue siendo funcional, pero el valor almacenado en su ubicación de memoria asociada se vuelve ilegible.
Esto genera un problema: una celda de memoria ocupada ahora contiene datos no confiables. Para evitar estos punteros, el puntero utilizado debe restablecerse a NULL.
Main.c
1234567891011121314151617#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; }
Asignar un puntero a NULL después de liberar su memoria es una forma clara de indicar que el puntero ya no referencia a una ubicación de memoria válida.
Siempre verificar si el puntero es NULL antes de utilizarlo para asegurarse de no acceder a memoria inválida o ya liberada.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Can you explain more about how malloc() and free() work together?
What happens if I forget to free memory allocated with malloc()?
Why is it important to set a pointer to NULL after freeing it?
Awesome!
Completion rate improved to 2.63
Malloc y Free
Desliza para mostrar el menú
Estas funciones nos permiten crear nuevos objetos no durante la compilación, sino durante la ejecución del programa, lo que posibilita el uso de asignación dinámica de memoria.
malloc()
Anteriormente, para asignar memoria a nuestros datos, simplemente declaramos:
int x;
Ahora, con la función malloc(), podemos asignar memoria de forma dinámica:
int* pX = (int*)malloc(4);
La función malloc() requiere como argumento la cantidad de bytes a asignar. Si no se conoce el tamaño en bytes necesario, pero sí el tipo de dato a almacenar, se puede ajustar la expresión de la siguiente manera:
int* pX = (int*)malloc(sizeof(int));
¿Qué sigue?
Observe 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 una conversión explícita. Especificamos manualmente el tipo deseado. Por ejemplo:
double x = 3.14;
int y = (int)x; // `y` = 3
Main.c
1234567891011#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
Recordar 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(), se utiliza el operador de desreferenciación.
Main.c
123456789101112#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.c
1234567891011121314151617#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, este sigue siendo funcional, pero el valor almacenado en su ubicación de memoria asociada se vuelve ilegible.
Esto genera un problema: una celda de memoria ocupada ahora contiene datos no confiables. Para evitar estos punteros, el puntero utilizado debe restablecerse a NULL.
Main.c
1234567891011121314151617#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; }
Asignar un puntero a NULL después de liberar su memoria es una forma clara de indicar que el puntero ya no referencia a una ubicación de memoria válida.
Siempre verificar si el puntero es NULL antes de utilizarlo para asegurarse de no acceder a memoria inválida o ya liberada.
¡Gracias por tus comentarios!