9

Linux カーネルのリンク リスト API を理解しようとしています。

Linux Kernel Linked Listによると、リストの先頭を初期化する必要がありますINIT_LIST_HEADが、ここ (Linux Kernel Program)では代わり に使用することをお勧めしますLIST_HEAD_INIT

これは私が書いた実用的なコードですが、適切な方法で作成したかどうかはわかりません。誰かがそれが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;
}
4

2 に答える 2

26

LIST_HEAD_INITは静的初期化子でINIT_LIST_HEADあり、関数です。どちらもaを初期化しlist_headて空にします。

を静的に宣言する場合はlist_head、次を使用する必要がありますLIST_HEAD_INIT。例:

static struct list_head mylist = LIST_HEAD_INIT(mylist);

INIT_LIST_HEAD()通常は別の構造の一部である、動的に割り当てられるリストヘッドに使用する必要があります。カーネルソースには多くの例があります。

于 2012-04-22T04:21:18.573 に答える
12

LXRをすばやく検索すると、次のように表示されます。

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

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

soINIT_LIST_HEADを取得しstruct list_head *て初期化しLIST_HEAD_INIT、渡されたポインタのアドレスを、リストの初期化子として使用するのに適した形式で返します。

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



struct list_head lst2 = LIST_HEAD_INIT(lst2);
于 2012-04-21T19:26:44.913 に答える