At least for 32-bit windows, each process gets its own copy of the address space, 2G user 2G kernel (shared by all processes), the virtual memory subsystem ensures that processes that access the same location get the appropriate data for their process. This is how a program can have the same entry point and be running multiple times while not stepping on data in use by other processes with the same executable.
Applications will continue to use up more of the virtual memory, and the kernel will allocate more physical memory to that process, until something runs out, physical memory, swap space/paging file. You can limit memory that can be used by a process through system calls.
Stack and heap are almost always allocated on opposite ends of available memory, so the stack grows down from the top of available memory while the heap grows up from the bottom (this decision depends on the architecture). This allows them to grow separately so that a program that needs a lot of heap but not much stack can use the same plan as one that needs lots of stack and not much heap.