Stack memory is managed for you by the compiler; heap memory you ask for and give back yourself.
The stack holds function locals and parameters. Each call pushes a frame, each return pops it, so cleanup is automatic and free. It is small, often one to eight megabytes, and blowing past it with deep recursion or a huge local array crashes the process.
The heap is a separate pool you allocate from at runtime. Objects there live until something frees them, so they can outlive the function that created them. Allocation costs a real call into the allocator, and forgetting to release leaks.
Default to the stack. Reach for the heap when the object must outlive the current scope. Also use it when the size is known only at runtime, or the object is too big for a frame.
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.
Why there's no diagram: “”
The interactive diagram is below the answer - jump to diagram ↓ · Below it, the related concept . Jump to it ↓
The diagram below the answer is the concept . Jump to it ↓