Se você estiver usando o Windows, o motivo é a estrutura do PE .
Sua heap
variável é armazenada na .data
seçã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 .data
seçã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 .text
seção é onde seu código compilado é e .data
contém sua heap
variá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 heap
do 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 0x8B0
bytes após o início da .data
seção. Portanto, toda vez que executo esse código, meu endereço termina 0x8B0
.