Это потому, что вы используете указатели на unsigned int
или какой-либо другой тип (для _start
и _key
), ширина которого составляет четыре байта. Вы заметите, что даже с арифметикой указателей в C / C ++ вы получите те же результаты.
Запишите это в foo.cpp
:
#include <cstdio>
int main(int argc, char** argv)
{
unsigned int* _start = (unsigned int*)0x08049054, * _key = (unsigned int*)0x0804916d;
printf("start(%p), key(%p) -> [key - start](%li)\n", _start, _key, _key - _start);
}
Теперь файл make (GNUmakefile
):
CXXFLAGS=-ggdb -g3 -O0
foo: foo.cpp
Создайте его, вызвав make
(если быть точным, GNU make).
Вывод будет:
start(0x8049054), key(0x804916d) -> [key - start](70)
... и 70 == 0x46
.