簡體   English   中英

當struct中的指針指向struct本身時,C如何解析循環定義?

[英]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?
};

添加1

或者,在32位機器上,我可以稍微將struct node * next成員視為32位無符號整數類型的成員嗎? 這讓我感覺好多了。

添加2

我想到循環定義的原因是,當編譯器遇到類似next -> datanext -> next ,它必須知道要添加到next指針的每個成員的確切偏移量 ,以獲得每個成員的正確位置。 而這種計算需要了解每個成員的類型 因此,對於next成員,可能會出現循環定義問題:

該類型的nextstruct node * ,該struct node類型包含了next的類型, nextstruct node * ...

添加3

編譯器如何計算sizeof(struct node)

添加4

好吧,我認為理解這個看似圓形的問題的關鍵概念是,指針的大小與它指向的類型無關。 並且尺寸固定在特定的機器上。 指針的類型在編譯時有意義,以便編譯器生成指針計算指令。

next是一個struct node * ,它只是一個指針,而不是一個struct node ,因此沒有實際的循環定義。 不需要結構的細節來弄清楚如何指向它。

要解決您的附錄:

  1. 雖然這或多或少准確並且可能會起作用,但標准並不保證,你不應該這樣做。
  2. 同樣, struct nodestruct node *是完全不同的類型。 struct node *不包含任何其他對象。

讓我按順序回答你的問題:

但是C編譯器如何解決循環定義問題?

struct node *next; 不是循環定義, struct node是不完整的類型, next定義為類型為struct node *的成員,它只是一個指針。

或者這個問題真的存在嗎?

不,不是真正的問題。 事實上,您可以將成員定義為指向任何未定義結構的指針。

或者,在32位機器上,我可以稍微將struct node *next成員視為32位無符號整數類型的成員嗎?

您不應對結構構件的實際尺寸,偏移或對齊做出任何假設。 32位機器的指針大小不是32位,只要你將它們用作指針而不是整數就沒關系。

我認為循環定義的原因是,當編譯器遇到next->datanext->next ,它必須知道要添加到next指針的每個成員的確切偏移量,以獲得每個成員的正確位置。

這是正確的,但是當編譯器解析這樣的代碼時,結構定義就完成了,它可以確定datanext成員的偏移量。

編譯器如何計算sizeof(struct node)

在解析結構定義之后,編譯器具有計算結構實例大小所需的所有信息。 對於這樣的計算,假設所有指向結構和/或聯合的指針具有相同的大小。

好吧,我認為理解這個看似圓形的問題的關鍵概念是,指針的大小與它指向的類型無關。 並且尺寸固定在特定的機器上。 指針的類型僅在編譯時有意義,以便編譯器生成指針計算指令。

指針的大小有關它指向的類型,並且在一些結構中,不同的指針類型可以具有不同的尺寸。 然而,C標准規定了一些限制:

  • 所有指針類型都可以轉換為void *和back。
  • 所有結構和聯合的指針都具有相同的大小。

在大多數現代架構上,特別是在Posix兼容系統上,所有標准指針類型都具有相同的大小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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