Quanto ao porquê 0x0C
parece mais comum do que 0x08
(é realmente? Eu não sei; e em que tipos de aplicativos?), Isso pode ter a ver com ponteiros de tabela de método virtual. Isso é realmente mais um comentário (adivinhação em massa :), mas é um pouco maior, então aqui vai ... Se você tem uma classe com métodos virtuais, seus próprios campos serão alterados 0x04
. Por exemplo, uma classe que herda de outra classe virtual pode ter um layout de memória como este:
0x00 - VMT pointer for parent
0x04 - Field 1 in parent
0x08 - VMT pointer for child
0x0C - Field 1 in child
Esse é um cenário comum, ou até próximo? Não tenho certeza. No entanto, observe que em um aplicativo de 64 bits, isso pode ser ainda mais interessante para o 0x0C
valor:
0x00 - VMT parent
0x08 - Field 1 parent
0x0C - VMT child
0x14 - Field 2 child
Portanto, existem muitos casos em que os aplicativos podem ter sobreposição significativa nas compensações de ponteiro nulo. Pode ser o primeiro campo de uma classe filho ou seu ponteiro de tabela de método virtual - necessário sempre que você chama qualquer método virtual em uma instância; portanto, se você estiver chamando um método virtual em um null
ponteiro, terá violação de acesso em seu Deslocamento da VMT. A prevalência desse valor específico pode ter algo a ver com alguma API comum que fornece uma classe que possui um padrão de herança semelhante ou, mais provavelmente, uma interface específica (possível para algumas classes de aplicativos, como jogos do DirectX). Pode ser possível rastrear uma causa comum simples como essa, mas eu costumo me livrar de aplicativos que fazem a desreferenciação nula muito rapidamente, então ...
0000000C
é muito mais comum do que isso00000008
, mas nenhuma das respostas parece abordar isso: /