linux内核中的container_of()宏中的(char *)转换
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了linux内核中的container_of()宏中的(char *)转换,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1346字,纯文字阅读大概需要2分钟。
内容图文
![linux内核中的container_of()宏中的(char *)转换](/upload/InfoBanner/zyjiaocheng/971/690c5adfac6d4418919b396567c4846a.jpg)
#define container_of(ptr, type, member) ({ const typeof( ((type *)0)->member ) *__mptr = (ptr); (type *)( (char *)__mptr - offsetof(type,member) );})
我已经知道第一行是用于类型检查,但对于第二行,
为什么要进行(char *)投射?我找不到解释这个.
我自己做了一些实验代码,即使没有演员,结果似乎也很好.
解决方法:
它是为计算获取字节级地址.否则,指针算法将根据所指向的类型进行,由于offsetof以字节为单位计算偏移量,因此会中断.
转换为char *在这样的低级基元内部非常常见,因为有时你真的需要将内存视为“字节数组”并在该级别操作它.
以此结构为例:
struct demo {
int foo;
float bar;
};
现在,如果我们这样做:
struct demo test;
float *intptr = &test.bar;
我们应该能够使用container_of()获得指向测试的指针:
struct demo *owner = container_of(intptr, struct demo, bar);
这将扩展到:
struct demo *owner = {(
const typeof( ((struct demo*)0)->bar) *__mptr = (intptr);
(struct demo*)( (char *)__mptr - offsetof(struct demo,bar) );})
所以第一行声明了一个浮点指针__mptr并将参数值复制到它.
第二行将成员指针强制转换为char *,然后在struct demo中减去bar的偏移量(如果sizeof(int)为4则为4),从而“备份”到整个结构测试的地址.
如果转换为char *不存在,那么4将被解释为float(因为__mptr是float *),这显然会备份得太远(16个字节而不是4个,假设float也是4个字节)造成可怕的破损.
请注意{{包装扩展container_of()的语法是GCC扩展;这在标准C中不起作用.
有关container_of()的更多信息,请参阅this page.
内容总结
以上是互联网集市为您收集整理的linux内核中的container_of()宏中的(char *)转换全部内容,希望文章能够帮你解决linux内核中的container_of()宏中的(char *)转换所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。