我在學習如何使用list.h的內核鏈表API。爲什麼我們需要list_for_each_safe()來刪除內核鏈表中的節點?
我瞭解到,當使用list_del()
而不是使用list_for_each()
刪除節點時,我需要使用list_for_each_safe()
。
代碼list_for_each_safe()
:
#define list_for_each_safe(pos, n, head) \
for (pos = (head)->next, n = pos->next; pos != (head); \
pos = n, n = pos->next)
代碼list_for_each()
:
for (pos = (head)->next; pos != (head); pos = pos->next)
我注意到他們都是隻是_safe
版本需要一個額外的參數非常相似,可以作爲「臨時存儲」 (在此陳述,list.h)。
我明白什麼時候應用功能correcly,_safe
刪除版本,正常版本的訪問,但我很好奇額外的參數如何使它「安全」?
考慮下面的,在那裏我刪除使用list_for_each_safe()
鏈表的每個節點:
struct kool_list{
int to;
struct list_head list;
int from;
};
struct kool_list *tmp;
struct list_head *pos, *q;
struct kool_list mylist;
list_for_each_safe(pos, q, &mylist.list){
tmp= list_entry(pos, struct kool_list, list);
printf("freeing item to= %d from= %d\n", tmp->to, tmp->from);
list_del(pos);
free(tmp);
}
如何讓q
幫助刪除?
感謝您的幫助!
我得到了它,沒想到正是這種直接的,謝謝 ! – 2012-02-10 00:11:30
q應該以更好的方式命名..類似於pos_next。 – 2014-09-03 09:27:45