Как правило, пространство кода программы и куча памяти выделяются снизу (начиная с нуля) пространства памяти, вверх. Обычно стеки начинаются с крайней вершины пространства памяти и растут вниз. Начальный размер стека может быть очень маленьким (одна страница), потому что, когда вы перерастете его, произойдет сбой страницы, и ОС сможет выделить больше места, увеличиваясь вниз.
Между прочим, в 64-битных процессорах x86 существует большой «разрыв» в середине 64-битного адресного пространства, потому что машина не реализует полную 64-битную адресацию. См. это в Википедии .