考虑此伪代码:
let k = 10;
let ptr = &k as *const k;
println!("{:p}", ptr); // prints address of pointer
let addr = format!("{:p}", ptr);
super-unsafe {
// this would obviously be super unsafe. It may even cause a STATUS_ACCESS_VIOLATION if you try getting memory from a page that the OS didn't allocate to the program!
let ptr_gen = PointerFactory::from_str(addr.as_str());
assert_eq!(k, *ptr_gen);
}
伪代码可以使您理解:我希望能够通过&str表示形式获得指向某个内存地址的指针。这可能吗?
答案 0 :(得分:1)
因此,基本上,您要执行的操作是将字符串解析回整数(usize
),然后将该值解释为指针/引用†:
fn main()
{
let i = 12i32;
let r = format!("{:p}", &i);
let x = unsafe
{
let r = r.trim_start_matches("0x");
&*(usize::from_str_radix(&r, 16).unwrap() as *const i32)
};
println!("{}", x);
}
您可以在playground中自己尝试。
†如您所见,您甚至不需要将引用转换为原始指针,{:p}
格式器会负责将其表示为内存位置(索引)
更新:正如E_net4在注释部分中提到的那样,最好在这里使用usize
,它是不同于机器大小的架构定义的。 transmute
不是必需的,因此我将其删除。然而,对于尝试执行上述操作的人来说,关于未定义行为的第三点似乎显而易见。这个答案提供了一种方法,可以实现OP要求的内容,但这并不意味着应该将其用于学术/实验目的以外的其他目的:)