2011-09-08 77 views
0

我在写一个程序,它在c中实现了一个堆栈。我希望每个节点采取任何类型的数据(即INT炭结构等),如果我声明我的节点结构作为堆栈中使用的C中的无效指针

typedef struct node{ 
      void *data; 
      struct node *next; 
    }Node; 

这是否让我的空指针数据指向任何类型的内存?

回答

3

是的,但有些警告涉及取消引用您的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指针。

1

这是否允许我的虚指针数据指向任何类型的内存?

是的。

1

简而言之,是的。这意味着你会存储一个指向int等的指针,这样就占用了空间。如果列表中没有同类型,则还需要确保知道如何处理不同的类型。

1

是的,它可能是你想达到的目标,但你需要照顾取消引用无效指针。我所指的是你必须在取消引用时键入caste无效指针到适当的类型。