内核链表中的结构和我们平常写的结构不同,我们的是在自定义的链表结点中定义链表结点的数据结构体中,而linux内核中却是在数据结构中包含结点,这样我们就不用为每一种类型定义一个结点结构了。整体效果如图(别人的图):
有一个问题是我们在知道了链表中指向结点域中的地址后需要找到数据结构的开始。
linux实现如下:
其中的offsetof用来求数据结构中变量的偏移:
自己写了个小程序测试了一下:
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int a;
int y;
int b;
}Node;
int main()
{
unsigned int offset=(unsigned int)&(((Node *)0)->b);
printf("offet=%u\n",offset);
return 0;
}
感觉对指针的理解很有帮助,与大家分享下。