Linux 核心設計
成大課程
contributed by < hbr890627
>
暫時使用 WSL (Windows Subsystem for Linux)
不需要在此標注日期,修改紀錄都在 HackMD 中。只是「觀看」不能算是成果,你至少該提出問題和摘要你所學到的事物。
注意書寫規範:中英文間用一個半形空白字元區隔。
在 make check
後發現錯誤。
發現並未分配記憶體給 e->value
,修改程式碼。
在 make check
時不再發生 ERROR ,但無法 git commit 。
根據 https://security.web.cern.ch/recommendations/en/codetools/c.shtml ,將不安全的 strcpy
,改為 strncpy
,並補上字串的結尾\0
。
發現有些人使用 strdup
取代 strcpy
,雖然實作起來較方便,但這不包含在C的標準函式庫,不利於程式的移植性。
參考資料
大致上與 q_insert_head
差不多,將 list_add
改為 list_add_tail
。
要移除第一個節點,實際上就是要移除 head->next
,而在 list.h
中,有 list_first_entry
這個巨集可以使用,用來精簡程式碼。
與 q_remove_head
幾乎相同,將 list_first_entry
改為 list_last_entry
即可。
此函式會被外部程式使用到,不用修改即可。
直接使用作業說明中的範例程式。
作業說明-lab0-牛刀小試
參考你所不知道的 C 語言: linked list 和非連續記憶體,使用龜兔賽跑的方式找到中間節點。
此段程式碼會出現 You dereferenced a NULL or invalid pointer
,但一直找不到問題出現在哪,在參考 mm0809 後,發現只要使用""
初始化 value
即可。
想要實作 reverse 的其中一個方式,就是從頭將結點移出,再照順序將結點 enqueue 即可,但根據作業要求,在此函式中,不能再額外分配記憶體用來暫時儲存暫時移出的節點,在思考解決方式時,參考 mm0809 的方式,只要先固定第一個指標後,不斷將後面的節點移到前面即可。
使用到你所不知道的 C 語言: linked list 和非連續記憶體中的 mergesort ,但是其實作的是單向的鏈結串列,必須在 merge 結束後,將 prev
的節點補上。