Адреса функций постоянны?

Это использует язык C с VC++ 2010 на Windows 7 64 бит.

Есть ли способ надежного и согласованного доступа к адресу функции (c linkage), чтобы он был одинаковым при каждом запуске вашей программы?

2 ответа

Если вы получили адрес во время выполнения, он должен оставаться стабильным для этого запуска. В следующий раз может быть иначе.

В ОС есть функции, которые могут привести к загрузке исполняемого кода по непредсказуемым адресам (частично из-за безопасности, частично из-за того, что двум DLL-библиотекам может потребоваться один и тот же базовый адрес).

Нет, потому что нет гарантии, что функция будет загружаться по одному и тому же адресу каждый раз для большинства современных ОС. На некоторых встроенных устройствах вы можете избежать этого, если ваш файл компоновщика определяет фиксированный адрес для функции.

Но зачем? Вы можете просто взять адрес функции, как у переменной:

void func(int a)
{
    a=5;
}

void main()
{
    // In case you don't know or don't care about the signature of the function.
    void* p = func;

    // In case you do care and might want to call the function
    // at some point through the pointer.
    void (*f)(int) = func;

    printf("%p %p",p, f);
}
Другие вопросы по тегам