Asignación dinámica - malloc()
Parte de la sección Logic & Flow del Journey de C de Coddy — lección 32 de 63.
Ahora aprenderás sobre malloc(), la función principal para solicitar memoria del montículo (heap) durante la ejecución del programa. La función malloc() significa "memory allocation" (asignación de memoria) y te permite asignar memoria dinámicamente cuando la necesites, en lugar de declarar variables de tamaño fijo en tiempo de compilación.
La función malloc() toma un argumento: el número de bytes que deseas asignar. Devuelve un puntero void al bloque de memoria asignado, o NULL si la asignación falla. Dado que devuelve un puntero void, debes realizar un cast al tipo de datos apropiado.
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Asignar memoria para un entero
// ptr ahora apunta a una ubicación de memoria que puede contener un enteroLa ventaja clave de
malloc()es la flexibilidad: puedes solicitar exactamente la cantidad de memoria que necesitas en tiempo de ejecución, y esta memoria permanece disponible hasta que la liberes explícitamente. Esto es particularmente útil cuando no sabes cuánta memoria necesitarás hasta que tu programa se esté ejecutando.
Recuerda incluir <stdlib.h> para usar malloc(), y siempre realiza un cast del puntero void devuelto para que coincida con el tipo de datos con el que estás trabajando.
Desafío
FácilEscribe un programa en C que demuestre la asignación dinámica de memoria utilizando malloc() para crear y trabajar con un único entero en el heap. Tu programa debe:
- Usar
malloc()para asignar dinámicamente memoria para un entero - Convertir (cast) el puntero void devuelto a un puntero de entero
- Leer un valor entero de la entrada del usuario
- Almacenar el valor de entrada en la memoria asignada dinámicamente utilizando el operador de desreferencia
- Imprimir el valor almacenado en el formato:
Stored value: [value] - Calcular y almacenar el cuadrado del valor en la misma ubicación de memoria
- Imprimir el valor al cuadrado en el formato:
Squared value: [value]
Recuerda incluir la cabecera <stdlib.h> para usar malloc(). Tu programa debe demostrar el flujo de trabajo básico de la asignación dinámica de memoria: solicitar memoria al heap, usarla para almacenar y manipular datos, y trabajar con la memoria asignada a través de operaciones con punteros.
Por ejemplo, si el usuario introduce 7, tu salida debería ser:
Stored value: 7
Squared value: 49Este desafío te introduce al concepto fundamental de la asignación dinámica de memoria, donde la memoria se solicita en tiempo de ejecución en lugar de estar fija en tiempo de compilación, otorgando a tus programas una mayor flexibilidad en el uso de la memoria.
Hoja de referencia
La función malloc() asigna memoria dinámicamente desde el montón (heap) durante la ejecución del programa. Toma el número de bytes a asignar y devuelve un puntero void al bloque de memoria asignado, o NULL si la asignación falla.
Incluya <stdlib.h> para usar malloc():
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Asignar memoria para un enteroPuntos clave:
- Siempre realice un cast del puntero void devuelto al tipo de dato apropiado
- La memoria permanece disponible hasta que se libera explícitamente
- Proporciona flexibilidad para solicitar cantidades exactas de memoria en tiempo de ejecución
- Use
sizeof()para determinar el número correcto de bytes necesarios
Pruébalo tú mismo
#include <stdio.h>
#include <stdlib.h>
int main() {
// Leer entrada
int input_value;
scanf("%d", &input_value);
// TODO: Escribe tu código a continuación
// 1. Usa malloc() para asignar memoria para un entero
// 2. Convierte el puntero devuelto a int*
// 3. Almacena el valor de entrada en la memoria asignada
// 4. Imprime el valor almacenado
// 5. Calcula y almacena el cuadrado en la misma ubicación
// 6. Imprime el valor al cuadrado
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Fundamentos de Punteros
¿Qué es un puntero?Declaración de punterosEl operador de dirección (&)El operador de desreferencia (*)Punteros NULLResumen: Conceptos básicos de punteros4Proyecto: Utilidad de texto simple
Descripción general del proyectoContar caracteres2Punteros y Arrays
Nombres de Arrays como PunterosElementos de un Array - PunterosAritmética de PunterosComparación de PunterosResumen: Recorrido de Arrays con Punteros5Punteros y funciones
Paso por valorPasar punteros a funcionesModificar variables mediante punterosUn ejemplo clásico: Intercambio (Swap)Pasar arrays a funcionesResumen: Argumentos de punteros a funciones3Arreglos de caracteres y cadenas
Cadenas como arreglos de charEl terminador nuloEntrada de cadenas con scanfUso de strlen()Uso de strcpy()Uso de strcat()Uso de strcmp()Resumen: Funciones básicas de cadenas6Gestión de memoria
Memoria Stack vs. HeapAsignación dinámica - malloc()Uso de sizeof() para la asignaciónComprobación de fallos de asignaciónLiberación de memoria con free()Asignación con calloc()Resumen: Arrays dinámicos