Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Malloc y Free | Punteros
Fundamentos de C

bookMalloc 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

Main.c

copy
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ón malloc().

Para almacenar datos en la dirección proporcionada por la función malloc(), se utiliza el operador de desreferenciación.

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 6. Capítulo 4

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Suggested prompts:

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

bookMalloc 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

Main.c

copy
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ón malloc().

Para almacenar datos en la dirección proporcionada por la función malloc(), se utiliza el operador de desreferenciación.

Main.c

Main.c

copy
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

Main.c

copy
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

Main.c

copy
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.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 6. Capítulo 4
some-alt