Se você estiver usando o Windows, o motivo é a estrutura do PE .
Sua heapvariável é armazenada na .dataseção do arquivo e seu endereço é calculado com base no início desta seção. Cada seção é carregada em um endereço independentemente, mas seu endereço inicial é múltiplo do tamanho da página. Como você não possui outras variáveis, o endereço provavelmente é o início da .dataseção, portanto, o endereço terá vários tamanhos de bloco.
Por exemplo, esta é a tabela da versão compilada do Windows para o seu código:
A .textseção é onde seu código compilado é e .datacontém sua heapvariável. Quando o seu PE é carregado na memória, as seções são carregadas em um endereço diferente e retornado VirtualAlloc()e será múltiplo do tamanho da página. Mas o endereço de cada variável é relativo ao início da seção que agora é do tamanho de uma página. Então você sempre verá um número fixo nos dígitos inferiores. Como o endereço relativo heapdo início da seção é baseado no compilador, nas opções de compilação, etc., você verá um número diferente do mesmo código, mas diferentes compiladores, mas sempre que o que será impresso for corrigido.
Ao compilar o código, notei que ele heapé colocado em 0x8B0bytes após o início da .dataseção. Portanto, toda vez que executo esse código, meu endereço termina 0x8B0.