The stack grows accordingly to the platform. Look at this question for details.
Besides the direction when the stack grows, when you need to increase the stack size, the Memory Managers asks for a contiguos virtual memory block in the direction it has to grow, if that request can be satisfied, your stack grows, otherwise the request fails.
The failure is handled differently, according to hardware architecture, operating system, and configurations. For example, a standard user mode application on windows generally fails with a "not enough memory to execute the operation", but the failure could vary as corruption could occur.
Each thread is allocated a range of contiguous virtual addresses upon start. This value is decided in order by the compiler, which can be overridden by you and finally overriden by the operating system. You can smash a process by simply starting a sufficient number of threads without doing number (aside from handle exhaustion which is irrelevant here).