[英]How does C resolve circular definition when a pointer in struct points to the struct itself?
我習慣於像下面那樣長時間編碼。
但是C編譯器如何解決循環定義問題? 或者這個問題真的存在嗎?
struct node {
int data;
struct node *next; // circular definition for "struct node" type?
};
或者,在32位機器上,我可以稍微將struct node * next
成員視為32位無符號整數類型的成員嗎? 這讓我感覺好多了。
我想到循環定義的原因是,當編譯器遇到類似next -> data
或next -> next
,它必須知道要添加到next
指針的每個成員的確切偏移量 ,以獲得每個成員的正確位置。 而這種計算需要了解每個成員的類型 。 因此,對於next
成員,可能會出現循環定義問題:
該類型的
next
是struct node *
,該struct node
類型包含了next
的類型,next
是struct node *
...
編譯器如何計算sizeof(struct node)
?
好吧,我認為理解這個看似圓形的問題的關鍵概念是,指針的大小與它指向的類型無關。 並且尺寸固定在特定的機器上。 指針的類型僅在編譯時有意義,以便編譯器生成指針計算指令。
next
是一個struct node *
,它只是一個指針,而不是一個struct node
,因此沒有實際的循環定義。 不需要結構的細節來弄清楚如何指向它。
要解決您的附錄:
struct node
和struct node *
是完全不同的類型。 struct node *
不包含任何其他對象。 讓我按順序回答你的問題:
但是C編譯器如何解決循環定義問題?
struct node *next;
不是循環定義, struct node
是不完整的類型, next
定義為類型為struct node *
的成員,它只是一個指針。
或者這個問題真的存在嗎?
不,不是真正的問題。 事實上,您可以將成員定義為指向任何未定義結構的指針。
或者,在32位機器上,我可以稍微將
struct node *next
成員視為32位無符號整數類型的成員嗎?
您不應對結構構件的實際尺寸,偏移或對齊做出任何假設。 32位機器的指針大小不是32位,只要你將它們用作指針而不是整數就沒關系。
我認為循環定義的原因是,當編譯器遇到
next->data
或next->next
,它必須知道要添加到next
指針的每個成員的確切偏移量,以獲得每個成員的正確位置。
這是正確的,但是當編譯器解析這樣的代碼時,結構定義就完成了,它可以確定data
和next
成員的偏移量。
編譯器如何計算
sizeof(struct node)
?
在解析結構定義之后,編譯器具有計算結構實例大小所需的所有信息。 對於這樣的計算,假設所有指向結構和/或聯合的指針具有相同的大小。
好吧,我認為理解這個看似圓形的問題的關鍵概念是,指針的大小與它指向的類型無關。 並且尺寸固定在特定的機器上。 指針的類型僅在編譯時有意義,以便編譯器生成指針計算指令。
指針的大小是有關它指向的類型,並且在一些結構中,不同的指針類型可以具有不同的尺寸。 然而,C標准規定了一些限制:
void *
和back。 在大多數現代架構上,特別是在Posix兼容系統上,所有標准指針類型都具有相同的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.