list_entry

更新时间:2023-05-18 20:15:42 阅读: 评论:0

list_entry
牛油果蔬菜沙拉
定义:
list_entry这样定义
#define list_entry(ptr, type, member) /
猪肝瘦肉汤((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
怕怎么组词
解释:找到成员member所在容器的地址。如果是结构体的话,就是找到结构体成员变量member所在结构体type的地址。
解释
摘抄的解释例⼦(有修改):
typedef struct
{
int i;
int j
适可而止的意思
} exp;
这个exp结构体占⽤8个字节.
假设声明⼀个变量。新年绘画图片大全>法学实习报告
exp e1;
那么假如已知 e1.j 的地址,想知道 e1 的地址该如何办呢?只要知道 j 在 e1 中的偏移,然后把 j 的地址减去这个偏移就是 e1 的地址了。在这⾥, i 占据的前4个字节,所以 j 占据了5-8的字节。
十大恐怖故事
现在我们⽤ list_entry 来解释⼀下。
int *p = e1.j;
假设 e1 的地址是 0x100,那么 p 就是 0x104。可是如何才能⽐较⽅便的知道 p 减去 4 就是 e1 的地址呢?尤其是我们可能有时候不知道 exp 这个结构体⾥⾯具体什么样⼦的。使⽤  list_entry(p, exp, j),则变成:今天是个好日子歌曲
(exp *)((char *)p-(unsigned long)(&((exp *)0)->j))
(exp *)0 在 0 地址上⾯建⽴ 8 个字节的 exp 结构体, ->j 取出这个0地址上exp结构体⾥的j成员, &((exp *)0)->j) 把这个成员地址取出来,由于 j 在这个结构体⾥是在5-8字节,所以从0地址数5个字节就是 j 所在的位置。这种⽅法省去了我们需要预先知道结构体具体什么样⼦,结构体⾥成员的位置怎么安排的。p 的地址再减去我们刚算出来j所在的位置,就得到 e1 的地址。也就是:
&e1 == list_entry(p, exp, j)

本文发布于:2023-05-18 20:15:42,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/685676.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:成员   地址   结构   知道   法学   变量   找到   减去
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图