Différence entre LIST_HEAD_INIT et INIT_LIST_HEAD
J'essaie de comprendre le noyau Linux liste liée de l'API.
Selon Le Noyau Linux Liste Liée je doit initialiser la liste de la tête par INIT_LIST_HEAD
mais ici (Noyau Linux Programme) il est suggéré d'utiliser LIST_HEAD_INIT
à la place.
Voici un code qui fonctionne, j'ai écrit, mais je ne sais pas si je l'ai fait de façon appropriée. Quelqu'un pourrait-il vérifier que c'est 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;
}
- ou maby a->atrributs doit être juste en tête de liste, pas une entrée de la liste?
Vous devez vous connecter pour publier un commentaire.
Un rapide LXR recherche montre:
Donc
INIT_LIST_HEAD
obtient unstruct list_head *
et l'initialise, tandis queLIST_HEAD_INIT
retourne l'adresse du pointeur passé en façonnée pour l'utiliser comme un initialiseur pour une liste:LIST_HEAD_INIT
est un initialiseur statique,INIT_LIST_HEAD
est une fonction. Ils ont à la fois l'initialisation d'unlist_head
être vide.Si vous êtes de manière statique de la déclaration d'une
list_head
, vous devez utiliserLIST_HEAD_INIT
, par exemple:Vous devez utiliser
INIT_LIST_HEAD()
pour une liste tête est allouée dynamiquement, habituellement une partie d'une autre structure. Il existe de nombreux exemples dans le source du noyau.