[問題] malloc 記憶體長度的問題

作者: gowrite (gowrite)   2021-01-22 02:27:55
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux Ubuntu 20
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
GCC 9.3
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
N/A
問題(Question):
我定義了一個 struct
typedef struct __list{
int data;
struct __list *next;
}list;
可以知道上面的 struct __list 所佔的空間是 16 byte
然後我產生了 3 個 node,每一個 linked list node 的資訊如下
第一個 node addr: 0x5650c11176b0 , data : 2
第二個 node addr: 0x5650c11176d0 , data : 3
第三個 node addr: 0x5650c11176f0 , data : 1
我的問題是:
第一個 node 位置是 0xb0,第二個 node 的位置是 0xd0
每個 node 長度為 16 byte,
為什麼第二個 node 距離第一個 node 的位置,為什麼不是 0xc0,差 16 byte,
而是差 32 byte
雖然 malloc 的 linked list 就是不連續的記憶體空間,
所以不能預期每個 node 會連在一起
但是又為什麼每個 node 都剛剛好差距 32 byte
有前輩可以解說一下嗎?
謝謝
餵入的資料(Input):
如上
預期的正確結果(Expected Output):
記憶體空間差距的疑問
錯誤結果(Wrong Output):
N/A
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
程式碼如上
補充說明(Supplement):
N/A
作者: sarafciel (Cattuz)   2021-01-22 04:08:00
多的那16byte是heap自己拿來做記憶體管理的 就這樣
作者: LPH66 (-6.2598534e+18f)   2021-01-22 05:28:00
另外可能還有所謂對齊 (alignment) 的問題
作者: chuegou (chuegou)   2021-01-22 09:11:00
32應該是對齊造成
作者: b0920075 (Void)   2021-01-22 11:57:00
你可以研究一下ptmalloc的實作,allocator會用一個叫chunk的結構管理分發回收記憶體,allocated chunk header第一個欄位是previous chunk size ,再來是該chunk 的size,再來才是你要放的data,所以會再差16bytes至於其他allocator是不是這樣就要再去看code,上面僅限於glibc的ptmalloc
作者: loveme00835 (髮箍)   2021-01-22 13:46:00
雖然說語言層最好還是不要對 malloc() 回傳值有什麼假設啦. 你用 _Alignof(list) 算出來如果比 16 小就不會是 alignment 造成這個問題啦, 一樓四樓講得比較有可能
作者: dces4212 (flawless)   2021-01-23 04:16:00
metadata?
作者: oToToT (屁孩)   2021-01-24 01:51:00
也不是每個人都只想處理語言層吧
作者: onlySN (Forza Milan)   2021-02-03 09:04:00
不只想處理語言層 那本來就不該用malloc做阿
作者: kingofsdtw (不能閒下來!!)   2021-02-05 01:19:00
未看先猜sizeof(int)

Links booklink

Contact Us: admin [ a t ] ucptt.com