通过&str获取指针

时间:2019-07-16 16:06:17

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

1 个答案:

答案 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要求的内容,但这并不意味着应该将其用于学术/实验目的以外的其他目的:)