[英]Why is a pointer mismatch allowed for a recursive typedef?
我一直在 learn-c.org 上學習 C
在介紹了有關 typedef 聲明和結構的單元之后。 他們完成了他們所謂的“鏈表的遞歸定義”,我發現它相當簡單,除了看起來像不匹配的指針......
typedef struct node{
int val;
struct node* next;
}node_t
// usage
node_t* head = NULL;
head = (node_t*) malloc(sizeof(node_t));
head->val = 1;
head->next = (node_t*) malloc(sizeof(node_t));
head->next->val = 2;
head->next->next = (node_t*) malloc(sizeof(node_t));
head->next->next->val = 3;
我的理解是,通過提供typedef struct node
,我們可以在結構中聲明next
節點指針。
我的困惑發生在第 11 行。我們為下一個節點動態分配 memory,但我們將 void 指針轉換為node_t
指針,而不是node
指針——盡管head->next
是(node*)
類型。 為什么允許這樣做? C 是否只是在幕后重鑄為(node*)
,而(node_t*)
用於提高可讀性?
typedef
使node_t
等效於struct node
,因此在任何可能使用struct node
的地方都可以使用較短的node_t
。 所以(node_t*)
等價於(struct node*)
。
一個例外是在結構聲明本身內部,因為要定義的名稱在typedef
語句之后才能使用(就像在聲明它們之前不能使用 function 或變量一樣)。
順便說一句,沒有必要強制轉換malloc()
的結果。 它返回void*
,並且 C 允許將其分配給任何指針類型,而無需顯式強制轉換。 請參閱是否要轉換 malloc 的結果?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.