The heap is where malloc(), calloc(), and
realloc() get memory.
Getting memory from the heap is much slower than getting it from the
stack. On the other hand, the heap is much more flexible than the
stack. Memory can be allocated at any time and deallocated in any
order. Such memory isnít deallocated automatically; you have to call
Recursive data structures are almost always implemented with memory
from the heap. Strings often come from there too, especially strings
that could be very long at runtime.
If you can keep data in a local variable (and allocate it from the
stack), your code will run faster than if you put the data on the
heap. Sometimes you can use a better algorithm if you use the heap
faster, or more robust, or more flexible.
Itís a tradeoff. If memory is allocated from the heap, itís
available until the program ends. Thatís great if you remember to
deallocate it when youíre done. If you forget, itís a problem.
A memory leak is some allocated memory thatís no longer needed but
isnít deallocated. If you have a memory leak inside a loop, you can
use up all the memory on the heap and not be able to get any more.
(When that happens, the allocation functions return a null pointer.)
In some environments, if a program doesnít deallocate everything it
allocated, memory stays unavailable even after the program ends.