我在写一个程序,它在c中实现了一个堆栈。我希望每个节点采取任何类型的数据(即INT炭结构等),如果我声明我的节点结构作为堆栈中使用的C中的无效指针
typedef struct node{
void *data;
struct node *next;
}Node;
这是否让我的空指针数据指向任何类型的内存?
我在写一个程序,它在c中实现了一个堆栈。我希望每个节点采取任何类型的数据(即INT炭结构等),如果我声明我的节点结构作为堆栈中使用的C中的无效指针
typedef struct node{
void *data;
struct node *next;
}Node;
这是否让我的空指针数据指向任何类型的内存?
是的,但有些警告涉及取消引用您的void指针来访问里面的数据。
基本上,说你有一个节点:
Node *node;
而且你有一些Point结构:
typedef struct Point {
int x;
int y;
} Point;
,你把一个点中的一个节点:
Point *p = malloc(sizeof(Point));
p->x = 0;
p->y = 3;
node->data = p;
在为了访问该点的成员,您必须使用类型转换:
printf("%d\n", ((Point *)node->data)->x);
或者你也可以指定正确类型的指针,复制无效指针:
Point *p = node->data;
printf("%d\n", p->x);
因为这是行不通的:
printf("%d\n", node->data->x);
这是因为一个空指针不包含为编译器提供类型信息,以便了解void指针指向的内容。
这几乎是所有你需要知道如何使用void指针。
这是否允许我的虚指针数据指向任何类型的内存?
是的。
简而言之,是的。这意味着你会存储一个指向int
等的指针,这样就占用了空间。如果列表中没有同类型,则还需要确保知道如何处理不同的类型。
是的,它可能是你想达到的目标,但你需要照顾取消引用无效指针。我所指的是你必须在取消引用时键入caste无效指针到适当的类型。