2012-04-21 11 views
6

arasındaki fark Linux çekirdeği bağlantılı liste API'sini anlamaya çalışıyorum.LIST_HEAD_INIT ve INIT_LIST_HEAD

Linux Kernel Linked List göre bunu yerine LIST_HEAD_INIT kullanmak bu önerilir here (Linux Kernel Program)INIT_LIST_HEAD tarafından liste başını başlatmak ancak gerekmektedir.

İşte yazdığım bir çalışma kodu, ancak doğru şekilde yapıp yapmadığımı bilmiyorum. Birisi doğru olduğunu doğrulayabilir mi? LIST_HEAD_INIT listesi için bir başlatıcısı olarak kullanım için uygun bir moda geçirilen pointer adresini döndürür iken, bir struct list head * alır Yani

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

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

INIT_LIST_HEAD ve atar:

#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

veya maby a-> atrributes yalnızca liste başı, liste girişi değil mi? – patseb

cevap

10

Hızlı LXR arama gösterir :

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); hata döndürüyor: "struct list_head" öğesinde "liste" adlı üye yok – patseb

17

LIST_HEAD_INIT statik başlatıcı olduğunu INIT_LIST_HEAD bir olduğunu işlevi. Her ikisi de boş olması için list_head'u başlatıyor. Dinamik tahsis edilir bir liste başının başka yapının genellikle kısmı için INIT_LIST_HEAD() kullanmalıdır

static struct list_head mylist = LIST_HEAD_INIT(mylist); 

:

statik olarak list_head ilan ediyorsanız, LIST_HEAD_INIT, örneğin kullanmalısınız. Çekirdek kaynağında birçok örnek var.