C言語で`containerof`の使い方について教えてください

C言語では、container_ofというマクロがあり、与えられたメンバーを含む構造体のポインタを取得するために使われます。

container_of の構文は次のとおりです。

#define container_of(ptr, type, member) ({ \
    const typeof(((type *)0)->member) *__mptr = (ptr); \
    (type *)((char *)__mptr - offsetof(type, member)); })

構造体型の変数typeのmemberメンバを指すポインタがptrです。

container_ofマクロは、ptrのアドレスから、structure内のmemberのオフセット分を引いて構造体の先頭アドレスを算出し、それをtype型のポインタにキャストします。

このマクロは通常、データ構造で構造体のポインタを取得するために使用されます。例えば、リンクトリストでノードを走査する場合、container_of マクロを使用してノードを含む構造体のポインタを取得してから、構造体に対して操作を実行できます。

bannerAds