Tôi đang tìm hiểu cách sử dụng API danh sách liên kết hạt nhân từ list.h.Tại sao chúng ta cần list_for_each_safe() để xóa các nút trong danh sách liên kết hạt nhân?
Tôi đã học được rằng tôi cần sử dụng list_for_each_safe()
khi xóa các nút bằng list_del()
thay vì sử dụng list_for_each()
.
Mã cho 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)
Mã cho list_for_each()
:
for (pos = (head)->next; pos != (head); pos = pos->next)
tôi nhận thấy cả hai đều rất giống nhau ngoại trừ việc phiên bản _safe
có một đối số phụ được sử dụng như 'lưu trữ tạm thời' (đã nêu ở đây, list.h).
Tôi hiểu khi nào nên áp dụng chức năng sửa đổi, _safe
phiên bản để xóa, phiên bản bình thường để truy cập, nhưng tôi tò mò về cách đối số thừa làm cho nó 'an toàn'?
Hãy xem xét những điều sau đây, nơi tôi đang xóa tất cả các nút trong một danh sách liên kết sử dụng 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);
}
Làm thế nào để đưa ra q
giúp đỡ trong việc xóa?
Cảm ơn bạn đã trợ giúp!
tôi đã nhận nó, không bao giờ nghĩ rằng nó là thế này thẳng về phía trước, cảm ơn ! –
q nên được đặt tên theo cách tốt hơn .. giống như pos_next. –