在 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,你也可以存储整数。
让我们假设一个 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,你也可以存储整数。