gpt4 book ai didi

c - 函数指针地址总是静态的吗?

转载 作者:行者123 更新时间:2023-11-30 14:48:02 26 4
gpt4 key购买 nike

如果一个函数指针在被另一个线程运行之前就超出了作用域,那么该指针会无效吗?或者函数指针是否始终有效,因为它们指向不会“移动”的可执行代码?

我认为我真正的问题是指针指向的内容(函数)是否会改变,或者该值在程序的整个生命周期中是静态的

伪代码:

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();
}

最佳答案

在 C 基础语言中,函数指针的值永远不会变得无效。它们指向函数,并且函数在程序执行的整个过程中都存在。指针的值对整个程序都有效。

包含指针的对象可能有有限的生命周期。 (注意:问题提到了范围,但范围是源代码中标识符可见的何处生命周期在程序执行期间存在一个对象。)在问题 void (*f)(void) = func; 中,f 是一个对象具有自动存储期限。一旦定义的 block 的执行结束,f 就不再存在,并且对其的引用具有未定义的行为。但是,分配给 f仍然是有效值。例如,如果我们定义 int x = 37;,并且 x 的生命周期结束,这并不意味着您不能再在程序中使用值 37。在这种情况下,f 的值(即 func 的地址)仍然有效。 func 的地址可以在程序执行过程中继续使用。

Xypron’s answer中讨论的情况关于动态链接函数或动态创建函数将是对 C 语言的扩展。在这些情况下,问题不是指针对象的生命周期,而是函数本身从内存中删除,导致指针不再是指向原始函数的有效指针。

关于c - 函数指针地址总是静态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50780306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com