2012-04-21 47 views
6

Tôi đang cố gắng hiểu API danh sách liên kết hạt nhân Linux.Sự khác biệt giữa LIST_HEAD_INIT và INIT_LIST_HEAD

Theo Linux Kernel Linked List Tôi nên khởi tạo đầu danh sách theo số INIT_LIST_HEAD nhưng thay vào đó, here (Linux Kernel Program) được đề xuất sử dụng LIST_HEAD_INIT.

Đây là mã làm việc mà tôi đã viết, nhưng tôi không chắc chắn nếu tôi đã làm nó theo cách thích hợp. Ai đó có thể xác minh rằng nó là OK?

#include <stdio.h> 
#include <stdlib.h> 
#include "list.h" 

typedef struct edge_attr { 
     int d; 
     struct list_head list; 
} edge_attributes_t; 

typedef struct edge { 
     int id; 
     edge_attributes_t *attributes; 
} edge_t; 

int main() { 
     int i; 
     struct list_head *pos; 
     edge_attributes_t *elem; 
     edge_t *a = (edge_t*)malloc(sizeof(edge_t)); 

     a->id = 12; 
     a->attributes = (edge_attributes_t*) malloc(sizeof(edge_attributes_t)); 

     INIT_LIST_HEAD(&a->attributes->list); 

     for (i=0; i<5; ++i) { 
       elem = (edge_attributes_t*)malloc(sizeof(edge_attributes_t)); 
       elem->d = i; 
       list_add(&elem->list, &a->attributes->list); 
     } 

     list_for_each(pos, &(a->attributes->list)) { 
       elem = list_entry(pos, edge_attributes_t, list); 
       printf("%d \n", elem->d); 
     } 

     return 0; 
} 
+0

hoặc maby a-> atrributes nên chỉ là danh sách đầu, không phải danh sách mục nhập? – patseb

Trả lời

10

Một LXR tìm kiếm nhanh cho thấy:

#define LIST_HEAD_INIT(name) { &(name), &(name) } 

static inline void INIT_LIST_HEAD(struct list_head *list) 
{ 
     list->next = list; 
     list->prev = list; 
} 

Vì vậy INIT_LIST_HEAD được một struct list head * và khởi tạo nó, trong khi LIST_HEAD_INIT trả về địa chỉ của con trỏ thông qua trong một thời phù hợp để sử dụng như một initializer cho một danh sách :

struct list_head lst1; 
/* .... */ 
INIT_LIST_HEAD(&lst1); 



struct list_head lst2 = LIST_HEAD_INIT(lst2); 
+0

struct list_head lst1; INIT_LIST_HEAD (&lst1); trả về lỗi: ‘struct list_head’ không có thành viên có tên ‘list’ – patseb

17

LIST_HEAD_INIT là trình khởi chạy tĩnh, INIT_LIST_HEAD là một chức năng. Cả hai đều khởi tạo list_head để trống.

Nếu bạn đang tĩnh tuyên bố một list_head, bạn nên sử dụng LIST_HEAD_INIT, ví dụ:

static struct list_head mylist = LIST_HEAD_INIT(mylist); 

Bạn nên sử dụng INIT_LIST_HEAD() cho một người đứng đầu danh sách đó được cấp phát động, thường là một phần của cấu trúc khác. Có nhiều ví dụ trong nguồn kernel.

Các vấn đề liên quan