c - 为什么传递给库的函数指针(作为回调)在执行时不会导致段错误?

标签 c pointers segmentation-fault

我最近使用函数指针实现了动态库回调注册的功能。 所以这意味着我传递了一个位于本地堆栈框架上的变量。 库如何在不因内存访问冲突而崩溃的情况下访问此变量?

最佳答案

这不是问题,因为函数本身永远不会存在于栈帧中。

假设你有这样的代码:

#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 中,我们将fptrnum 都设置为局部变量的。如果我们试图在 f 返回后引用 ap,我们就会遇到麻烦,但我们从来没有这样做过。

fptr 不包含 p;它包含&g,这只是一个常量,恰好是函数g在内存中的位置。 gf 返回后继续存在于该位置,因为函数本身不是局部变量。

这就是设置回调时发生的情况;该库中的某处是一个变量,它被分配给您传递的函数的地址。

关于c - 为什么传递给库的函数指针(作为回调)在执行时不会导致段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55028788/

相关文章:

c - 函数指针的别名

c - 在此函数中将 system ("pause") 放在哪里?

c# - 如何编码指向包含无符号字符数组的结构数组的指针?

c++ - unique_ptr - 无效指针和段错误

c++ - 调用 pthread_create() 时出现段错误 C++ Linux

c - 如何从一个 makefile 构建多个目标

c++ - 如何查找变量是在堆栈还是堆中分配?

c - 固定数组的大小而不是在 C 中使用指针

c - 如何在结构数组中初始化和动态分配一个 int 指针成员?

c++ - 为什么会出现段错误?