簡體   English   中英

為什么遞歸 typedef 允許指針不匹配?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM