В базовом языке C значения указателей на функции никогда не становятся недействительными.Они указывают на функции, и функции существуют в течение всего времени выполнения программы.Значение указателя действительно для всей программы.
Объект, содержащий указатель, может иметь ограниченный срок службы.(Примечание: упомянутый вопрос scope , но scope равен , где в исходном коде виден идентификатор. Время жизни равно когда во время выполнения программы существует объект.) В вопросе void (*f)(void) = func;
, f
- это объект с автоматической продолжительностью хранения.После выполнения блока он определен в концах, f
больше не существует, и ссылки на него имеют неопределенное поведение.Однако значение , присвоенное f
, все еще является допустимым значением.Например, если мы определим int x = 37;
, а время жизни x
закончится, это не означает, что вы больше не можете использовать значение 37 в программе.В этом случае значение, которое имело f
, то есть адрес func
, остается в силе.Адрес func
может и впредь использоваться во время выполнения программы.
Ситуации, обсуждаемые в Ответ Xypron относительно динамически связанных функций или динамически создаваемых функций, будут расширениями для языка Си.В этих ситуациях речь идет не о времени жизни объекта указателя, а о том, что сама функция удаляется из памяти, что приводит к тому, что указатель перестает быть действительным указателем на исходную функцию.