2013-05-27 63 views
2

我發現這個事情有點棘手和遞歸,如何sizeof運算符計算鏈接列表中的一個節點的大小。我有下面的結構,一個節點列表,例如:鏈接列表節點的大小

struct ll_core 
{ 
    char c_ll; 
    struct ll_core * next; 
}; 

printf("size of struct ll_core = %d\n\n",sizeof(struct ll_core)); 

它給了我一個答案8.現在是怎麼做的決定大小8,因爲添加單獨的結構元素的尺寸也agains遇到同樣的struct ll_core。所以這是計算大小時的一種循環或遞歸。請原諒我,讓我知道如果我在思考這件事的時候想念我腦海中的任何基本事物。

回答

2

假設您在32位機器上運行您的代碼,指針大小將爲4個字節。由於結構將在字邊界上對齊,因此將填充3個字節,因此大小將爲8個字節。

這種結構實際上是等,

struct ll_core{ 
    char  c_11: 
    char const byte[3]; //padded bytes for alignment reasons 
    struct ll_core *next; 
}; 
3

它不需要結構的大小再次,因爲該結構只包含一個指針結構,而不是結構本身。

「指向struct ll_core的指針」的大小與struct ll_core的大小無關,它們是兩種截然不同的類型。一個是指針,另一個不是。

你不能聲明一個「真正的」遞歸數據結構,因爲它是無限的。

2

因爲要添加單個struct元素的大小,它會再次遇到相同的struct ll_core

不,它遇到指針struct ll_core。如果它遇到結構本身,那將導致無限大小。編譯器知道struct ll_core *的大小和對齊要求,即使不知道關於struct ll_core的任何內容,因此它可以添加成員的大小加上對齊所需的填充(此例中爲next成員)以查找struct ll_core的大小。

0

如果某些類型在特定地址上對齊,許多處理器的工作效果會更好。這意味着編譯器會在單個元素之後填充您的結構,以便指針位於本機字邊界上。

至於結構中的「遞歸」,沒有,因爲next字段是指針而不是結構本身。

0

你錯過了一點,仔細看......'下一個'只是一個指針。 你不能只做'結構ll_core下一個'..這是沒有*。所以,只要它是一個指針。 大小將僅針對指針的大小計算。一般情況下,指針大小爲4

如果您有任何困惑,從下一個刪除*,並嘗試編譯代碼。

0

有2個元素是一個char(大小爲1)和一個指針(大小爲4),所以你會認爲大小是5,但是結構被填充到4個字節(字大小)。字符填充爲4個字節,總共爲8個。

1
struct ll_core 
{ 
    char c_ll; 
    struct ll_core * next; 
}; 

sizeof操作者增加了結構ll_core的構件的尺寸。這裏是一個字符(c_ll)和一個指針(next)。

關於如何計算大小的更多信息。

結構填充:

在64位系統中,數據將讀取並寫爲8個字節塊。所以當計算結構的大小時,會發生填充。意味着編譯器會在結構成員之間插入一些空隙,以便與結構地址邊界「對齊」。東西如下:

struct ll_core 
{ 
    char c_ll; 
    /* 7 bytes of padding */ 
    struct ll_core * next; 
}; 

因此這種結構在一個64位系統的尺寸將是16個字節。

結構包裝:

您可以防止編譯器做結構包裝做結構填充。在海灣合作委員會,它是這樣做的:

struct __attribute__((__packed__)) ll_core 
{ 
    char c_ll; 
    struct ll_core * next; 
}; 

現在的大小將是一個64位機器上的9個字節。

sizeof(char) + sizeof(pointer)

編輯 - 從你的問題看來你是一個32位的機器上運行。在32位機器中,數據將被讀寫爲4字節的塊。

+0

因此,通過這個答案和所有其他人的理解,32位機器(我的32位也是這樣)以4字節塊讀/寫數據,這使得這個結構如下: (c_ll 1byte + 3byte padding) - 4bytes struct ll_core * next - 4bytes 因此加起來最多8個字節.. !! –

+0

是的,沒錯 – Sanish