c - C中的函数指针转换

标签 c function gcc function-pointers

我听说,将指向函数的指针转换为 void* 是不安全的。

好的,施法安全吗

void (*enumerate) (void (*)(const struct foo *event, void *), void *)

void (*enumerate) (void (*)(const void *event, void *), void *)

然后用

调用它

void (*)(const void *, void *) 作为第一个参数,它将其第一个 void* 视为 struct foo*?

最佳答案

不,这不安全。 C 标准不保证 struct foo *void * 具有相同的大小和格式。通常,将函数指针转换为其他函数指针类型是灾难的根源。安全的解决方案是插入一个额外的函数,将参数转换为正确的类型,就像您为处理非 void *qsort 编写比较函数时所做的那样> 参数:

static int compare_foo_as_voidp(void const *a, void const *b)
{
    return compare_foo((struct foo const *)a, (struct foo const *)b);
}

(正如 Oli Charlesworth 在评论中所写,转换本身不是问题,但通过指针调用会导致 UB。)

关于c - C中的函数指针转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10960839/

相关文章:

C、OpenMP、更改计划类型、setenv

c - 如何在C中使用malloc正确分配内存

python - Op 和 Function 有什么区别

.net - .NET7 升级后,在本地运行 Azure 函数会出现 "No runtime"错误

c - Eclipse 中 gcc 编译器的默认标志

c++ - Sun Studio 链接 gcc 库 : exceptions do not work

你能解释一下这是从哪里来的吗?

c++ - 为什么类成员函数是内联的?

c - 将 GCC 内联汇编与采用立即值的指令一起使用

c - 如何在openCV的全屏无边框窗口中显示图像