gpt4 book ai didi

在 C 中转换 void 指针

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:34 25 4
gpt4 key购买 nike

让我们假设一个 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;
}

让编译器对我大喊“expected ‘void *’ but argument is type of some_type”之类的警告。我该如何解决这种警告?

像这样的东西(直接转换)

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

可以做到吗?

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

最重要的是,是否可以检查 void 指针(即在其中)是否属于 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 中转换 void 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42566481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com