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

Contenido del Curso

Fundamentos de C

Fundamentos de C

1. Introducción
2. Datos
3. Operadores
4. Declaraciones de Control
5. Funciones
6. Indicadores

bookMalloc 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:

c

Main

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

Recuerda incluir el fichero de encabezado stdlib.h. Contiene el prototipo de la función malloc().

Para almacenar datos en la dirección proporcionada por la función malloc(), utilizamos el operador dereference.

c

Main

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 sólo la memoria asignada por malloc() y funciones similares.

free()

Esta función se utiliza con punteros. Para ilustrarlo, ampliemos el ejemplo anterior:

c

Main

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

c

Main

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; }

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.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

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