4

正如我所听说的,将指针转换为函数是不安全的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*?

4

1 回答 1

7

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

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。)

于 2012-06-09T12:22:34.463 回答