在 C 中转换 void 指针

Casting void pointers in C

让我们假设一个 C 中的数据结构,例如

struct node {
    void *value;
    struct node *next;
} *Node;

是否有可能将 void 指针转换为特定类型的值?如果可以,如何安全操作?

像这样创建主线

int main (void) {
    Node n = create_node ();

    insert (n, 2);
    insert (n, 3);

    return 0;
}

或者这个

int main (void) {
    Node n = creade_node ();

    // any struct. e.g.:
    struct data d = create_data ();

    insert (n, d);

    return 0;
}

使编译器对我大喊大叫,例如“预期的‘void *’但参数类型为 some_type。我该如何解决此类警告?

类似这样的东西(直接投射)

insert (Node n, void *value) {
    struct data new_value = (struct data) value;
    ...
}

可以做吗?

例如,在 Java 中,我可以安全地检查某些方法参数(对象)是否是特定类型的实例,然后在适当的情况下执行转换。我怎么能在 C 中做到这一点?

最重要的是,是否可以检查空指针(即在其中)是否属于 some_type 类型,如果是,将该值转换为 some_type?

指针是一个地址。结构是一堆已知大小的数据。尽管可以将指向结构的指针转换为 void *,因为两者都是地址,但不能将结构转换为 void *,因为结构不是地址。您唯一可以做的就是将 指针指向 来自 void * 的结构:

insert (Node n, void *value) {
    struct data* new_value = (struct data*) value;
    ...
}

In Java, e.g., I can safely check if some method argument (object) is instance of a specific type and then perform a cast, if appropriate. How could I do this in C?

你不能。 void* 只不过是一个地址。你无法知道这个地址指向什么,甚至你指向的数据的大小。

您可以使用 C 的 intptr_t 而不是 void *,它被定义为一个足够大的 int,可以在其中存储一个指针。所以你可以在存储的时候把你的指针转换成int,你也可以存储整数。