Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Malloc y Free | Punteros
C Básico
course content

Contenido del Curso

C Básico

C Básico

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

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

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 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(), usamos el operador de desreferencia.

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

free()

Esta función se utiliza con punteros. Para ilustrar, 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 "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.

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

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.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

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