1. 问题提出

我们知道,如果有一个结构体定义如下:

 
  
  1. struct _st { 
  2.   int a; 
  3.   char b; 
  4. } st ; 

我们可以通过st访问到a或者b,方法就是st.a(或者如果有st的指针pst,那么就用pst->a)。但是,如果知道了结构体中元素的指针,是否可以获得当前结构体的指针呢?或者说,如果我只能访问到b,我可以访问到st和a么?

2. 这个问题的实际意义

首先,这样做有什么用呢?其实,自己早就知道linux内核中linus就是使用了container_of()的宏,就是利用的这个方法。最近,在项目中,碰到了一个问题,想了想暂时没有想到特别好的方法。而使用这个方法倒是可以比较好的解决问题。

大致上问题抽象出来就是:有一些BLOCK,需要用多个链表串起来。比如有B1,B2,B3,B4,B5共5个BLOCK,要用三个不同功能的链表串起来:

链表1: B1->B4->B5

链表2: B2->B5

链表3: B1->B2->B3->B4->B5

而项目希望使用glib中的链表库实现。而glib中的链表库(这里举一个单向链表的例子)是这样组织的(参见Glib文档):

 
  
  1. typedef struct { 
  2.   gpointer data; 
  3.   GSList *next; 
  4. } GSList;

数据用data指针链接起来,实现单向链表。这里,如果有人有推荐的库也希望说出来,呵呵。这里我们如果用glib的库显然不容易实现我们想要的功能,因为我们不知道B2的next是要指向B5(如链表2中)还是B3(如链表3中)。我们显然需要多个next指针做到这一点。而如果我们这样使用: