如何獲取malloc 分配後的空間大小?

時間 2021-12-19 12:40:07

1樓:

可以說基本沒有理解錯大方向

主要原因確實是對齊

對齊可以極大提公升CPU效率所以作業系統總是會為了對齊而寧可損失一點點空間

次要原因就涉及幾種堆的安全機制了,具體的英文名有點忘了(Windows安全學的太菜了),只是記得幾個和題主所說現象好像有點關係的機制,至於是不是不太敢下定論(題主給的除錯資訊不足+自己能力不足)

而且現在是手機碼字,隨便答答,懶得細查了233(劃掉)提供乙個思路,具體的題主再查查

2樓:

@李天宇 的答案還需要再補充一下。如果只是把3個標誌位的資訊去掉,得到的將是112,而不是104.

這是因為:

我們觀察原始碼

首先寫個示例程式

#include

#include

#include

intmain

()可以看出,庫函式`malloc_usable_size`給我們返回的值為104

而h指標處存的值為113 在去掉了最後三位標誌位之後,是112. 與104還差8

這時我們檢視malloc.c的原始碼

Anallocated

chunk

looks

like

this

:chunk

->|Size

ofprevious

chunk,if

unallocated(P

clear)|

|Size

ofchunk,in

bytes|A

|M|P

|mem

->|User

data

starts

here

......

.(malloc_usable_size

()bytes).

.|nextchunk

->|(

size

ofchunk

,but

used

fordata)|

|Size

ofnext

chunk,in

bytes|A

|0|1

|從示意圖看,malloc_usable_size確實是我們想知道的,使用者可用的空間大小。

我們檢視該函式的原始碼

size_t

__malloc_usable_size

(void*m

)就是簡單呼叫了musable,我們繼續看musable的原始碼

static

size_t

musable

(void

*mem

)elseif(

inuse(p

))return

chunksize(p

)-SIZE_SZ;}

return0;

}可以看到關鍵例程在於chunksize,繼續看

/* Get size, ignoring use bits */

#define chunksize(p) (chunksize_nomask (p) & ~(SIZE_BITS))

那麼就是先拿到不加掩碼的,再mask一下。

看看`SIZE_BITS`是多少吧

那麼肯定就是

`((0x1) | (0x2) | (0x4))`了

好,那麼下來就是看chunksize_nomask了

/* Like chunksize, but do not mask SIZE_BITS. */

#define chunksize_nomask(pp)->mchunk_size)

這裸指標就是題主寫的方法了,也就是我們寫的

printf

("%d",*

((int*)

h));

//113

對應的h

這就是遞迴到底了,接下來我們回推。

對拿到的113,要做mask操作,和`~((0x1) | (0x2) | (0x4))`做按位與了之後,得到112

之後,由於沒有用mmap,則應該執行

elseif(

inuse(p

))return

chunksize(p

)-SIZE_SZ

;從而,再減去`SIZE_SZ`之後,即為返回值.

`SIZE_SZ`在64位的機器上就是8

因此應該再減去8

這是因為chunksize(p)實際上也包括了頭資訊的大小,因此應該減去此部分的大小8.

這個8,實際上也就是我們讓`h=p-8`的8

因此,整個過程為

指標拿到113,113做mask得到112,112減去SIZE_SZ得到104.

3樓:李天宇

沒有錯。如你所說malloc分配給你是有最小單元的。所以header最後三個bit會是0(大小一定是8的倍數)。

機智的程式設計師們自然會好好利用這三個位元存放一些其他資訊,包括是否free,前後是不是free等乙個bit就可以表達的資訊。

所以實際的大小是header & (!0x8)不過這樣獲取大小是不好的,自己玩玩就算了,不可以依據這個來寫程式,否則很容易出現一些不知所云的記憶體錯誤。

獲取到窗體的控制代碼後,該如何獲取窗體上的所有控制元件?

https www.google.com search?q E8 8E B7 E5 8F 96 E5 88 B0 E7 AA 97 E4 BD 93 E7 9A 84 E5 8F A5 E6 9F 84 E5 90 8E EF BC 8C E8 AF A5 E5 A6 82 E4 BD 95 E8 ...

如何度過分手後的空窗期?

哈哈啊哈 首先,不要試圖去尋找新歡,想著隨便找個人湊合一下,當你找到那個人後,你會發現他不是我想要的,我不喜歡,也無法將就,換乙份工作,那種累到讓你躺下就睡 當你難過的時候你可以選擇去旅行,去吃自己喜歡的東西,看自己感興趣的書,學習一些技能,世間萬物,你會發現那麼多東西等著你去做,那麼多書等著你去看...

unity中預設獲取的深度圖到底是什麼空間下的

啵啵啵 Unity取樣的深度圖是ndc下的,非線性深度。Opengl平台應該是近裁剪面為0,遠裁剪面為1。ndc下是深度範圍是 1,1 因為進行了對映才在 0,1 DX平台的話一般會進行reverse z,Opengl是沒有reverse z的,近裁剪面為1,遠裁剪面為0。ndc下深度範圍 0,1 ...