У меня есть простой массив int. Я использую этот код для получения адреса памяти массива:
// My App is x64
GCHandle objHandle = GCHandle.Alloc(MyIntArray, GCHandleType.Pinned);
IntPtr address = objHandle.AddrOfPinnedObject();
Console.WriteLine($"My Array Pointer Address : 0x{address.ToString("X8")}");
В результате я получаю 0x24F409F6FE8 .
Я пытался найти его одновременно с помощью сканера памяти, и я искал данные и нашел их в 0x24F409F6FE5
3 меньше результата AddrOfPinnedObject.
Я пытался запустить приложение 20 раз и каждый раз расстояние между адресом AddrOfPinnedObject и фактическим адресом было 3:
AddrOfPinnedObject -> Actual Address
0x152635C6FE8 -> 0x152635C6FE5
0x29D13ED6FE8 -> 0x29D13ED6FE5
0x20198BD6FE8 -> 0x20198BD6FE5
0x22149416FE8 -> 0x22149416FE5
0x2763D396FE8 -> 0x2763D396FE5
and so on...
Пожалуйста, кто-нибудь объяснит, почему это происходит и как я могу получить адрес без такого исправления и получить фактический адрес.