Because the heap is a far more complicated data structure than the stack.
For many architectures, allocating memory on the stack is just a matter of changing the stack pointer, i.e. it’s one instruction. Allocating memory on the heap involves looking for a big enough block, splitting it, and managing the “book-keeping” that allows things like free()
in a different order.
Memory allocated on the stack is guaranteed to be deallocated when the scope (typically the function) exits, and it’s not possible to deallocate just some of it.