我最近使用函数指针实现了动态库回调注册的功能。 所以这意味着我传递了一个位于本地堆栈框架上的变量。 库如何在不因内存访问冲突而崩溃的情况下访问此变量?
最佳答案
这不是问题,因为函数本身永远不会存在于栈帧中。
假设你有这样的代码:
#include <stdio.h>
void (*fptr)(void);
int num;
void g(void) {
printf("Hello, world!\n");
}
int f(void) {
int a = 42;
num = a;
void (*p)(void) = &g;
fptr = p;
}
int main(void) {
f();
printf("%d\n", num);
fptr();
}
在f
中,我们将fptr
和num
都设置为局部变量的值。如果我们试图在 f
返回后引用 a
或 p
,我们就会遇到麻烦,但我们从来没有这样做过。
fptr
不包含 p
;它包含&g
,这只是一个常量,恰好是函数g
在内存中的位置。 g
在 f
返回后继续存在于该位置,因为函数本身不是局部变量。
这就是设置回调时发生的情况;该库中的某处是一个变量,它被分配给您传递的函数的地址。
关于c - 为什么传递给库的函数指针(作为回调)在执行时不会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55028788/