2011-09-08 38 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無效指針到適當的類型。