On a virtual memory system, we are accessing main memory in units of "page". So, suppose a page size is 4KB, and a process needs 100 MB of main memory, we can allocate 25K page frames and these frames may be at any point in physical memory- they need not be contiguous, only each 4KB needs to be contiguous.
Now, the compiler generates addresses (virtual) which are continuous. During run time memory for heap and stack are also given and each of them is also continuous to facilitate variable addressing in programs. Now, the given paragraph talks about the space allocated to stack and heap. We can say stack starts from memory address 0x2FFF and heap from 0x1000 and stack goes down and heap grows up. During program run both the stack and heap size can change (during each function call, stack grows as new activation record gets created and during dynamic memory creation like malloc, heap grows). So, in the above example, I gave after sometime stack and heap spaces might collide. To avoid this we must leave enough gap between them and also limit the maximum memory space a process can take. In linux usually 8KB is the default stack limit for a process.