Отлаживая некоторый код в Visual Studio 2008 (C ++), я заметил, что адрес в моей переменной указателя функции не является фактическим адресом самой функции. Это внешняя функция "C".
int main() {
void (*printaddr)(const char *) = &print; // debug shows printaddr == 0x013C1429
}
Address: 0x013C4F10
void print() {
...
}
Разборка адреса взятия функции:
void (*printaddr)(const char *) = &print;
013C7465 C7 45 BC 29 14 3C 01 mov dword ptr [printaddr],offset print (13C1429h)
РЕДАКТИРОВАТЬ: Я просмотрел код по адресу 013C4F10, и компилятор, очевидно, вставляет команду "jmp" по этому адресу.
013C4F10 E9 C7 3F 00 00 jmp print (013C1429h)
На самом деле в .exe есть целая таблица переходов для каждого метода.
Может кто-нибудь объяснить, почему он это делает? Это отладочная «фича»?