Адрес указателя функции всегда статичен? - PullRequest
0 голосов
/ 10 июня 2018

Если указатель функции выходит из области действия перед использованием в другом потоке, будет ли указатель недействительным?Или указатели на функции всегда действительны, поскольку они указывают на исполняемый код, который не «перемещается»?

Я думаю, что мой реальный вопрос заключается в том, изменится ли когда-нибудь указатель на (функция), или этостатическое значение на протяжении всей жизни программы

псевдокод:

static void func(void) { printf("hi\n"); }

int main(void)
{
    start_thread();
    {
        void (*f)(void) = func;
        // edit: void run_on_other_thread(void (*f)(void));
        run_on_other_thread(f); // non-blocking. 
    }
    join_thread();
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

В базовом языке C значения указателей на функции никогда не становятся недействительными.Они указывают на функции, и функции существуют в течение всего времени выполнения программы.Значение указателя действительно для всей программы.

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

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

0 голосов
/ 10 июня 2018

То, останется ли указатель функции действительным, зависит от его использования.

Если он указывает на функцию в исходном коде вашего процесса, он остается действительным во время выполнения процесса.

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

Можно написать код, который перемещает сам себя.Например, когда ядро ​​Linux запускается, оно перемещает себя, изменяя адреса функций.

Вы можете вызвать компилятор времени выполнения, который создает функции в памяти во время выполнения программы, возможно, повторно используя память, когда объект выходит из области видимости.

Как сказано, это зависит.

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