GDB арифметика - PullRequest
       9

GDB арифметика

1 голос
/ 24 февраля 2011

Когда я использую команды:

print / x & _start -> я получаю: 0x08049054 print / x & _key -> я получаю: 0x0804916d

Довольно легко понять, чторазница: 119h

Но если я использую команду:

print / x & _key - & _ start -> я получаю: 0x46 (!!)

Почему?Кто-нибудь подтверждает это, если отлаживает собственную программу?

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

То, что вы видите, является арифметикой указателя.

См. Также: SO: Арифметика указателя

1 голос
/ 24 февраля 2011

Это потому, что вы используете указатели на 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...