水木社区手机版
首页
|版面-C++程序设计语言(CPlusPlus)|
新版wap站已上线
返回
1/1
|
转到
主题:今天掉进一个不算坑的坑
3楼
|
txgx
|
2020-10-21 09:12:06
|
展开
reinterpret_cast<size_t*> ?
【 在 fanci 的大作中提到: 】
: 得亏我及时一通搜索搞定。是这样的:
: 有三个类 A, B, C,其中 A和B都非空,而C同时继承A和B,即 struct C : A, B {...};
: 那么从 C的指针 static_cast 到 B的指针是会改变指针的值的。我想计算这个偏移量(有几字节),于是我搞了这么个:
: ...................
--
FROM 42.234.94.*
13楼
|
txgx
|
2020-10-22 11:09:00
|
展开
https://www.cnblogs.com/aceheart/articles/3229638.html
其中,整个程序中最关键的部分就是如何求出结构体中某个成员相对于结构体首地址的偏移量。
这里的解决方法是:假设存在一个虚拟地址0,将该地址强制转换成为该结构体指针类型(struct id*)0。那么地址0开始到sizeof(struct)-1长度的内存区域就可以视为一个结构体的内存。
这样结构体中任何一个元素都可以通过对该结构体指针解引用得到。
由于该结构体的起始地址为0,因此任何一个成员的地址应该等于其相对于结构体起始地址的偏移,这也就是计算偏移量的方法:
#define STRUCT_OFFSET(id, element) ((unsigned long) &((struct id*)0)->element)
Linux内核里面的list_entry宏就是这样的。
【 在 fanci 的大作中提到: 】
:
https://devblogs.microsoft.com/oldnewthing/20160224-00/?p=93081
--
FROM 42.234.94.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版