gpt4 book ai didi

pointers - 如何从指向成员的指针获取指向包含结构的指针?

转载 作者:行者123 更新时间:2023-11-29 08:33:24 25 4
gpt4 key购买 nike

我有一个类型:

struct Foo {
memberA: Bar,
memberB: Baz,
}

还有一个指针,我知道它是指向 Foo 中的 memberB 的指针:

p: *const Baz

获取指向原始结构 Foo 的新指针 p: *const Foo 的正确方法是什么?

我当前的实现如下,我很确定由于取消引用 (p as *const Foo) 而调用未定义的行为,其中 p 不是指向 Foo 的指针:

let p2 = p as usize -
((&(*(p as *const Foo)).memberB as *const _ as usize) - (p as usize));

这是 FFI 的一部分 - 我无法轻易地重构代码以避免需要执行此操作。

这与 Get pointer to object from pointer to some member 非常相似但是对于 Rust,据我所知没有 offsetof 宏。

最佳答案

解引用表达式产生了一个左值,但该左值实际上不是读取的,我们只是对其进行指针数学运算,所以理论上,它应该是定义明确。不过这只是我的解释。

我的解决方案涉及使用空指针来检索字段的偏移量,因此它比您的要简单一些,因为它避免了一次减法(我们将减去 0)。我相信我看到一些 C 编译器/标准库通过从空指针返回字段地址来实现 offsetof,这启发了以下解决方案。

fn main() {
let p: *const Baz = 0x1248 as *const _;
let p2: *const Foo = unsafe { ((p as usize) - (&(*(0 as *const Foo)).memberB as *const _ as usize)) as *const _ };
println!("{:p}", p2);
}

我们也可以定义自己的offset_of!宏:

macro_rules! offset_of {
($ty:ty, $field:ident) => {
unsafe { &(*(0 as *const $ty)).$field as *const _ as usize }
}
}

fn main() {
let p: *const Baz = 0x1248 as *const _;
let p2: *const Foo = ((p as usize) - offset_of!(Foo, memberB)) as *const _;
println!("{:p}", p2);
}

关于pointers - 如何从指向成员的指针获取指向包含结构的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40309915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com