Если кратко, то во время выполнения программы есть
две области памяти в которых можно выделять память.
Стек отличается скоростью выделения пространства для переменной, но ограничен по размерам и времени жизни самой переменной(Она уничтожается при выходе из области видимости). Следственно большие, долгоживущие объекты не всегда разумно создавать на стеке.
Куча же наоборот, более дорогая операция по времени выделения памяти, но время жизни переменных контролируешь ты сам и места там больше в среднем. Аллокаторы(malloc, calloc и т.п.) как раз выделяют память в куче.