Pointers 通过&;str

Pointers 通过&;str,pointers,rust,unsafe,Pointers,Rust,Unsafe,考虑以下伪代码: 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

考虑以下伪代码:

    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表示获得指向某个内存地址的指针。这是。。。可能吗?

因此,基本上您要做的是将字符串解析回整数(
usize
),然后将该值解释为指针/引用†:

fn main()
{
设i=12i32;
设r=format!({:p},&i);
设x=不安全
{
设r=r.trim_start_匹配(“0x”);
&*(usize::from_str_radix(&r,16).unwrap()为*const i32)
};
println!(“{}”,x);
}
你可以自己在厨房里试试

†如您所见,您甚至不需要将引用强制转换为原始指针,
{:p}
格式化程序负责将其表示为内存位置(索引)



更新:正如E_net4在评论部分提到的,最好在此处使用
usize
,这是一种不同于机器大小的架构定义。
transmute
不是必需的,所以我删除了它。关于未定义行为的第三点对于任何试图做上述事情的人来说都是显而易见的。这个答案提供了一种实现OP要求的方法,但这并不意味着它应该用于学术/实验目的以外的任何其他目的:)

为什么不能先将字符串表示形式转换回无符号整数?啊,这是通过transmute还是std::mem或std::ptr下的其他方式来实现的,如果我在学习低级编码的过程中出错了,请纠正我的错误,但是不是所有指针在内存中的大小都相同吗?(需要知道无符号要使用多少位)这里的要点在中得到了回答,使用
from_str_radix()
将例如“0xdeadbeef”转换为整数;从那里你投到一个ptr*希望没有人在看谢谢你!我很高兴我们现在已经回答了这个问题。虽然锈在阳台上使用magnum进行保护并不意外。真的不用担心,但无论你打算用它做什么,都要小心!(我警告过你;))此外,我拒绝了你的编辑,因为这无助于理解IMO。如果你愿意,我建议你将其作为单独的答案发布。使用互斥锁和一些图表,我相信我能够在任何不必要的事情发生之前退出;)。谢谢,编辑没有问题。值得一提的是,此解决方案中存在多个问题:1。它仅适用于64位指针宽度目标,应使用
usize
而不是
u64
;2.不需要
transmute
,您可以将
usize
值强制转换为原始指针,使用
as
并取消引用它;3.这将创建一个具有n个无限生存期的引用,因此它的生存期可以比原始值更长。请参见建议的更改+UB。非常有趣的添加Enet。谢谢