Você não especificou um contexto exato. Mas isso pode ser respondido para os casos mais comuns (por exemplo, x86):
- Algum espaço de endereço inicial é reservado para proteção contra acesso à memória na desreferência de ponteiro NULL.
- Em seguida, a memória é alocada de acordo com as especificações do início do processo e pode ser mesclada entre o carregador de tempo de execução, seus dados, o principal binário, seus dados etc. - tudo isso é geralmente alocado com incrementos nas etapas de tamanho de página da VM. >
- Em seguida, uma área grande é usada para colocar bibliotecas dinâmicas, alocação de heap baseada em página etc. - novamente, incrementada para alocação. Mas, se o programa for multithreaded, ele alocará pilhas de encadeamentos que são confirmadas em ordem reversa (para a maioria dos processadores, incluindo x86).
- Em seguida, uma alocação sequencial baseada em sbrk pode ser usada para o heap.
- Em seguida, a pilha de encadeamentos principal é colocada. As alocações são provavelmente confirmadas em ordem inversa (veja acima).
- Em seguida, a área do kernel é colocada; a única coisa que um aplicativo deve saber é que ele não acessará essa área sem permissão explícita.
Assim, você provavelmente verá alocações nas duas direções em praticamente todos os programas.
Isso pode ser diferente em outras arquiteturas.