Lección 22: Memoria dinámica — stack, heap y malloc
Hasta ahora todas nuestras variables vivían en el stack: se crean automáticamente, su tamaño se fija de antemano, y desaparecen cuando la función termina. A veces eso no basta — por ejemplo cuando quieres un arreglo cuyo tamaño se conoce solo en tiempo de ejecución. Para eso está el heap: pides memo
El stack es como una bandeja de cafetería: la recibes automáticamente y te la quitan al final de la comida sin preguntar. El heap es como un depósito de alquiler: pides una unidad del tamaño que elijas (malloc), recibes una llave (el puntero), y la unidad es tuya — hasta que devuelves la llave (free). Si pierdes la llave sin devolverla, la unidad se queda ocupada.
- stack (pila)
- Área de memoria automática: aquí viven las variables locales y desaparecen cuando la función termina. Su tamaño debe fijarse de antemano.
- heap (montículo)
- Área de memoria de la que pides bloques en tiempo de ejecución. Lo que pediste, eres responsable de liberarlo con free.
- malloc(size)
- Pide un bloque de size bytes del heap y devuelve su dirección, o NULL si falla. Requiere #include <stdlib.h>.
- free(p)
- Devuelve al heap el bloque al que apunta p. Cada malloc necesita un free cuando terminas.
- comprobación de NULL
- Justo después de malloc, comprueba if (p == NULL) — cuando no hay suficiente memoria libre, malloc devuelve NULL y el puntero no debe usarse.