Asignación dinámica - malloc()
Parte de la sección Lógica y Flujo 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ón durante la ejecución del programa. La función malloc() significa «asignación de memoria» y te permite asignar memoria dinámicamente cuando la necesitas, en lugar de declarar variables de tamaño fijo en tiempo de compilación.
La función malloc() acepta un argumento: el número de bytes que quieres asignar. Devuelve un puntero void al bloque de memoria asignado, o NULL si la asignación falla. Como devuelve un puntero void, puedes asignarlo directamente a un puntero tipado; la conversión de tipo es opcional en C (a diferencia de C++, que la requiere).
#include <stdlib.h>
int *ptr = (int*)malloc(sizeof(int)); // Asigna memoria para un entero
// ptr ahora apunta a una ubicación de memoria que puede contener un enteroLa principal ventaja de
malloc()es la flexibilidad: puedes solicitar exactamente la cantidad de memoria que necesitas durante la ejecución, y esta memoria permanece disponible hasta que la liberas explícitamente. Esto resulta especialmente útil cuando no sabes cuánta memoria necesitarás hasta que el programa esté en ejecución.
Recuerda incluir <stdlib.h> para usar malloc(); convertir mediante una conversión explícita el puntero void devuelto es opcional en C, ya que se convierte automáticamente al tipo al que lo asignas.
Desafío
FácilEscribe un programa en C que demuestre la asignación dinámica de memoria usando malloc() para crear y trabajar con un solo entero en el montón. Tu programa debe:
- Usar
malloc()para asignar memoria dinámicamente para un entero - Convertir el puntero void devuelto en un puntero a entero
- Leer un valor entero de la entrada del usuario
- Almacenar el valor introducido en la memoria asignada dinámicamente usando el operador de desreferenciación
- Imprimir el valor almacenado con el formato:
Stored value: [value] - Calcular y almacenar el cuadrado del valor en la misma ubicación de memoria
- Imprimir el valor al cuadrado con 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 del montón, usarla para almacenar y manipular datos, y trabajar con la memoria asignada mediante operaciones con punteros.
Por ejemplo, si el usuario introduce 7, tu salida debe ser:
Stored value: 7
Squared value: 49Este desafío te introduce al concepto fundamental de la asignación dinámica de memoria, en la que la memoria se solicita durante la ejecución en lugar de estar fijada en tiempo de compilación, lo que proporciona a tus programas una mayor flexibilidad en el uso de la memoria.
Pruébalo tú mismo
#include <stdio.h>
#include <stdlib.h>
int main() {
// Leer la entrada
int input_value;
scanf("%d", &input_value);
// TODO: Escribe tu código debajo
// 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. Print the squared value
return 0;
}Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y Flujo
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ámicosPractica por tu cuenta: Compilador de C online