Похоже, ваш указатель переполнен.
Давайте посчитаем. Допустим, вы работаете на 32-битной машине, и ваш указатель инициализирован на 0x 12 34 56 78
. Затем мы инициализируем переменную типа unsigned в -1
, то есть 0x FF FF FF FF
. Поскольку целое число без знака, -1
переполнено и фактически представляет 4 294 967 295
.
Ваш указатель на целое число (int*
), поэтому каждое приращение фактически увеличивает адрес на sizeof int
, то есть 4 на стандартном компьютере x86. Таким образом, мы на самом деле добавляем 0x 03 FF FF FF FC
(то есть 0x FF FF FF FF * 4
).
Теперь давайте сложим два вместе.
0x 00 12 34 56 78
+ 0x 03 FF FF FF FC
-------------------
0x 04 12 34 56 74
Конечно, это переполняется, потому что теперь у нас есть 40-битное значение, а указатель 32-битный и может содержать только столько информации. Поэтому мы теряем 04
в начале. В результате получается 0x 12 34 56 74
, то есть 0x 12 34 56 78 - 4
.