& nbsp; & nbsp;我已经开发了很长时间了。
对于C之类的事情,我不敢说我已经精通。
毕竟,在学习过程中仍然会遗忘许多细节,然后慢慢地进行练习。
捡起来。
因此,它只能被视为一个熟练水平。
& nbsp; & nbsp; < nbsp; Linux内核的实现是广泛而深刻的。
大部分由C语言实现。
从offsetof的实现到后来的container_of,为什么可以通过结构的成员获得整个结构的指针?这是由于offsetof宏的实现。
关于此宏,以前的博客文章也对此进行了解释,但是不够深入。
今天的例子足以充分理解结构本身的原理。
让我们看一下以下示例:#include& lt; stdio.h& gt; //在32位系统上,当未指定对齐方式时,默认情况下结构以4个字节对齐。
typedef struct __ST {int id; // 4 char * name; // 4浮点运算; // 4} ST; int main(){ST st; //获取结构的第一个元素的第一个地址int * ptr_0 =(int *)(& st); printf(“ st:& nbsp;%p& nbsp;& nbsp; ptr:& nbsp;%p & amp; st,ptr_0); //为结构的第一个元素分配一个值* ptr_0 = 100; printf(“ * ptr_0 =%d ",* ptr_0); //获取该结构的第二个元素的第一个地址,因为第二个元素是一个第一级指针,所以您需要使用第二个指针来进行连接。
char ** ptr_1 =(char **)((int)& st + 4); printf(" ptr_1:%p " ptr_1); //为结构的第二个元素分配一个值* ptr_1 =“ hello world”; printf(" ptr_1:%s ",* ptr_1); //获取结构中第三个元素的第一个地址,并根据对齐原则offset计算第三个元素的地址。
float * ptr_2 =(float *)((int)& st + 8); printf(“ ptr_2:%p " ptr_2); //分配结构的第三个元素* ptr_2 = 96.78; printf(“ ptr_2:%。
2f ",* ptr_2); //输出结构中所有成员的值printf(“ st.id =%d& nbsp; st.name =%s& nbsp; st.math =%。
2f ”,st.id,st.name,st.math); & nbsp; & nbsp;返回0;}& nbsp; & nbsp; & nbsp;实际上,根据对齐原理计算出的偏移量不是宏的偏移量原理#define offsetof(TYPE,MEMBER)((size_t)&(((TYPE *)0)-> MEMBER )& nbsp; & nbsp; & nbsp;  我们将继续查看链接列表,函数指针等以及结构。
相关概念立即变得清晰起来,而曾经学到的障碍之路也被完全打开了。