gpt4 book ai didi

c - 为什么我不能将动态函数指针传递给 atexit()?

转载 作者:行者123 更新时间:2023-12-02 01:37:51 25 4
gpt4 key购买 nike

我可以将常规函数指针传递给atexit():

void f1(void)
{
printf("f1\n");
}

int main() {
void (*fun_ptr)(void) = &f1;
atexit(fun_ptr);
}

但是当我传递从另一个函数返回的函数指针时:

typedef void (*f22_t) (void);

f22_t f2(void) {
void f22(void) {
printf("f22\n");
}

return f22;
}


int main() {
void (*fun_ptr2)(void) = f2();
atexit(fun_ptr2);
}

结果是:

Illegal instruction (core dumped)

为什么第一个选项更糟糕而第二个选项则不然?

此外,我可能误读了 atexit() 的文档 https://man7.org/linux/man-pages/man3/atexit.3.html或者 https://pubs.opengroup.org/onlinepubs/007904875/functions/atexit.html但在我看来,其中没有任何内容提到为什么第二种情况不起作用的信息。

最佳答案

在另一个函数中定义一个函数是 GCC 扩展。每the GCC documentation ,当包含函数的执行结束时,嵌套函数的生命周期也结束:

… If you try to call the nested function through its address after the containing function exits, all hell breaks loose…

因此,在f2退出后,它提供的指向f22的指针不支持进一步使用,并将其传递给atexit以稍后再调用会导致一切困惑。

(实际上,GCC 通过在程序堆栈上创建一些可执行代码来实现嵌套函数,即使大部分函数代码像往常一样位于“文本”区域中。指向嵌套函数的指针指向该代码堆栈。包含函数退出后,其堆栈空间通常会被重新用于其他目的,从而破坏在堆栈上创建的代码。因此尝试执行该代码会失败,因为字节已更改。)

关于c - 为什么我不能将动态函数指针传递给 atexit()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72043248/

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