簡體   English   中英

在C中的鏈表實現中,節點的大小和生存期是多少?

[英]What is the size and lifetime of a node in a linked-list implementation in C?

在C(或C ++)的鏈表實現中,節點的大小和指針變量的生存期是多少? 例如:

struct node
{
  int data;
  struct node *next;
}*ptr=NULL;

現在我想知道節點的大小:是4個字節,如果是,如何? 其次,指針的壽命是多長:在程序執行期間? 最后,將*ptr稱為實例變量或數據成員或對象是否合適?

通常不可能知道節點的大小。 但是,對於特定的平台和一組庫,您可以在編譯時知道節點的大小。

sizeof(struct node)

會告訴您節點的大小。 注意,它可能不是節點內所有成員的實際大小之和。 有時,必須填充以使結構中的成員在正確操作所需的內存對齊邊界上對齊。

另外,指針沒有特定的大小。 它們足夠大,可以容納所需的內存地址,但這是它們必須滿足的唯一要求。 32位和64位環境之間的指針大小存在巨大差異,即使在同一硬件上的兩個受支持的位環境之間切換,即使不同的硬件平台可能對存儲指針值有不同的內存要求。

人們從一個普遍的誤解中得知“使用4個字節存儲指針”是指所有使用C的計算機都是Intel CPU,屬於奔騰系列芯片,只能運行32位代碼。 當時的假設是不正確的,現在假設也同樣不正確。

即使考慮到這一點,該結構的數組也可能需要在數組元素之間填充以正確進行內存對齊。 結果,即使您知道結構的大小,也無法確保X元素的數組將適合X * sizeof(struct node)字節的內存區域。

使用sizeof(...)查找所需的答案,但要確保您要采用的大小幾乎所有內容都在sizeof(...)運算符中。

就指針的壽命而言,只要程序正在運行,它就一直存在。 但是,存儲在node->next的值實際上可能未引用有意義的地址。 node->next用於保存地址,但是有太多方法可以欺騙node->next以指向未指定滿足struct node需求的位模式開頭的地址。

C語言的這種“問題”在某種程度上被后來的語言所修復,這意味着通過使指針類型的操作變得不可能來“改進” C語言。 相反,這些語言允許使用安全的指針操作子集,這意味着您確實沒有指針(因此他們將其稱為引用)。 Java和C#是兩種這樣的語言,但是有許多人否認對指針進行真正危險的操作。

將指針稱為變量的實例是不合適的,因為它實際上是一個擁有內存地址的變量。 沒有嚴格要求它保存的內存地址必須包含滿足指針“類型”的位模式。 它只是那些遺留的C問題之一,為了與C兼容,C ++保留了這些問題。此外,實例變量傾向於建議使用面向對象的術語,而C無法(以其默​​認形式)提供面向對象的保證,因此, C的面向對象編程術語是不合適的。

同樣,結構也不是類,並且該結構的成員所遵循的規則與類的成員略有不同。 最大的“略有不同”規則是,結構的成員通常是可公開訪問的,除非您實際上非常小心地在程序的其余部分中隱藏了結構的聲明(這將需要大量的C體操操做和制作)您的程序仍然有效)。

  1. 節點的大小取決於您的計算機和編譯器。 使用sizeof(struct node); 為拿到它,為實現它。 不是4個字節。 在32位環境中,它是8( int為4字節,而struct node *為4字節)。

  2. ptr貫穿程序執行的整個過程。 ptr是全局變量。

  3. ptr實例變量,*ptr表示內存ptr指向的位置。

Sizeof是一個編譯時操作。 節點是一個結構。 因此,節點的大小是結構中所有成員大小的總和。 所以你有一個整數和一個指針。 節點的大小是整數的大小+指針的大小。 壽命:內存是動態分配的。 除非您撥打免費電話,否則節點將生存。 如果u執行刪除操作,好的程序員會用我們的風格釋放分配給該節點的內存。

暫無
暫無

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

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