Гарантированы ли функции C с фиксированным адресом памяти?
Если я сохраняю указатель на функцию, а затем в какой-то более поздний момент во время выполнения моей программы сравниваю его с адресом той же функции, оба гарантированных адреса будут равны.
например.
int foo(void){return 0;}
int (*foo_p)(void) = &foo;
assert(foo_p == &foo);
В приведенном выше коде утверждается, что утверждение всегда гарантировано? Существуют ли какие-либо обстоятельства, при которых может измениться адрес функции?
Ответы
Ответ 1
В 6.5.9:
Два указателя сравнивают одинаковые, если и только если оба являются нулевыми указателями, оба являются указателями на один и тот же объект (включая указатель на объект и подобъект в начале) или function, оба являются указателями на один из последних элементов одного и того же объекта массива, или один - указатель на один за концом одного объекта массива, а другой - указатель на начало другого объекта массива, который происходит с немедленно следует за первым объектом массива в адресном пространстве.
(Жирный шрифт добавлен для акцента.)
Ответ 2
Адрес функции никогда не изменится. Многие программы основаны на концепции обратных вызовов, которые не будут работать, если может измениться адрес функции.
Если гипотетически изменение местоположения функции, например, с помощью самомодифицирующей программы, то все вызовы этой функции вызовут поведение segfault или very undefined. Редактировать: Символы описания - как указатели, если указана указатель free
на указатель, который не будет обнулять фактическую переменную указателя, он все равно будет указывать на нее, так же как вызовы вашей функции будут по-прежнему указывать на старое местоположение перемещенная функция.
Самомодифицирующиеся программы - очень большие исключения, хотя, и в эти дни секция кода двоичного файла представляет собой защищенный от записи рендеринг, это очень и очень сложно.