>>849
mallocの実装例としては、ヒープをunionによるブロック単位で扱い、先頭をヘッダーとして用いて確保ブロックサイズを記録する方法がある。(あくまで実装方法のひとつ)

ヒープメモリー(□は未使用、■は使用中。□ひとつが16byte)
□■□□□□□■□□■■□□□□■■■□□■□□□

例:20byteを確保したい場合。
1.ヒープから20byte分を格納できる連続領域を捜す。
(20byteだから□2個分+ヘッダー用1個=3個以上連続して空いてる場所を捜す)
□■□□□□□■□□■■□□□□■■■□□■□□□
  ↑
  ここが空いてる

そこをヘッダーとして、確保サイズの記憶に用いる。(ヘッダーに”確保サイズ20”をメモする)
□■20□□□□■□□■■□□□□■■■□□■□□□
  ↑
  以降20byteが使用されてるという印

ヘッダーの次のアドレスをmallocの戻り値とする。(ユーザーは、ここ以降20byteを使用して良い)
□■20□□□□■□□■■□□□□■■■□□■□□□
   ↓
   ヘッダーの次の□の位置を、mallocのリターンとして返す。

例:これを free()する場合
□■20□□□□■□□■■□□□□■■■□□■□□□
   ↓
   free()には、malloc()の戻り値の先頭アドレスを渡す。
   このアドレスを、□1つ分もどると、そこがヘッダーとして、malloc時に確保したサイズが記録されている。
   この20を参考にして free()は動作する。(ヘッダーのリンクをリセットする)

備考:実際にはサイズの20だけではなく、次の空き領域へのポインターも同時に格納されてるかもしれない。(あくまで実装方法のひとつ)
a = malloc(20)で得たaを、適当に数バイト後ろに戻って、記録されてるデータを確認していけば、20という数字が見つかるかもしれない。