contributed by < POCHUN-CHEN >
在講義mergeTwoLists()
中,
第 4 行的 *node = (*node)->next
左右式的資料型別是不同的,struct ListNode
應改成 struct list_head
,之後再使用 element_t *L1_entry = list_entry(L1, element_t, list);
取得內含值結構體 element_t
的參數 L1_entry
方便比較大小排序。
在寫大數的時候發現困難重重,經過與老師一對一討論後,詳讀前三週課程(目前看到第二週),之前的疑問有很多都知道該如何處理(但實做後才能驗證自己是否掌握)。預計看完第三週講義後,會進入 fibdrv 實做。
x & (x - 1) == 0
的數學意義
x & (x - 1)
運算後的結果是把二進位的最右面那個 1
變成 0
,除了可以檢查二進位數值中有幾個 1
位元、檢查是否為 ,還有沒有更深層的理解呢?
signed v.s. unsigned :有無號如何跟上式有關係呢?
memcpy(user_dest, kbuf, len);
,len
是 unsigned ,故該「負」的數值,會表示成一個很大的正數值,在此刻,輸入參數就會是錯誤的,導致記憶體位置錯誤。為什麼強調「負」的數值,如果是錯誤的len
數值,應該就會導致輸入參數會是錯誤,導致程式有問題。況且原文中提到「懷有惡意的程式設計師」,是否不只是程式錯誤的問題?還會引發更嚴重的問題呢?(例如可以存取到特定的記憶體位置內部的資料)
&((TYPE *)0)->MEMBER
把地址 0 轉形成函式指標,利用 0 指到 MEMBER
的大小當成 offset 的值。編譯器處理 &((TYPE *)0)->MEMBER
時,不會真正去存取地址為 0 的記憶體區段,那背後到底是如何運作(都不真的 0 了)?
list_for_each
的程式碼定義與圖示如下是否應為下圖才比較合理?
這時可以查詢到
list_entry
是container_of
等價的包裝,符合以 list_ 開頭的命名慣例,此處的 entry 就是 list 內部的節點。
特別注意:在 list_
系列的 member
都限定在 list_head member
。
如果 list_
系列的 member
,故意輸入 struct
中,不是 list_head member
的成員,應該會發生錯誤?該如何防呆?