contributed by < njjack
>
注意看 2019q1 Homework1 (作業區) 的要求,HackMD 網址應採 publish 後的網址,請留意細節,及早變更。包含空白和排版,均有指定格式。
無論標題和內文中,中文和英文字元之間要有空白字元 (對排版和文字搜尋有利)
實作 queue functions
考慮題目要求 q_insert_tail( ) 和 q_size( ) 執行時間需為 ,在 queue_t 結構中加入 size
和 tail
command 以 struct CELE
表示,儲存在 single linked list 中
呼叫 add_cmd 將一個新的 command 加入 linked list 中適當位置(按字母順序排序)
每次 command 輸入會呼叫 interpret_cmda
來搜尋 linked list ,找到並呼叫 command 對應之處理函式
(實際上每次 command 輸入按 function call 順序會呼叫 cmd_select
, interpret_cmd
, parse_args
, 最後才將 parsing 後得到之 "command that has already been split into arguments" 作為 input 呼叫 interpret_cmda
)
malloc
和 free
替換成 test_malloc
和 test_free
block_ele_t
結構實作一 doubly linked list ,記錄已分配之記憶體空間。payload[0]
為 Array of Length Zero 技巧之使用。每一段已分配記憶體空間都有一 block_ele_t
結構之 header ,藉由存取 payload 可直接存取此 header 之後的記憶體空間。test_malloc
實際會分配的記憶體空間,除了提出請求之記憶體大小,還包含 header(一個 block_ele_t
結構) 和 tail (一個 magic number)test_malloc
成功配置記憶體空間後,會將 header 中 magic_header
設 MAGICHEADER
, 並呼叫 find_footer
找到 tail 的 magic number 設為 MAGICFOOTER
MAGICHEADER
和 MAGICFOOTER
分別為常數 0xdeadbeef
和 0xbeefdead
,作為存取位置是否合法的判斷依據test_free
會檢查 tail 的 magic number 是否為 MAGICFOOTER
,若否,則釋放此空間非合法動作test_free
將magic_header
和 tail 的 magic number 都設為 MAGICFREE
test_malloc
和 test_free
都會將配置或是放的記憶體空間初始為常數 FILLCHAR
已避免若某位置存放數值恰為前述已使用過之常數,可能造成判斷合法與否時誤判