【问题标题】:Rust pointer deference with vectorsRust 指针解引用与向量
【发布时间】:2020-07-10 21:37:48
【问题描述】:

我被卡住了,为什么 println 上的 *p1.offset(0) 给了我 0。有什么想法吗?

fn main() {
        let p1 : *const u8 = vec![17u8,2u8].as_ptr();
        let p2 : *const u8 = "123".as_ptr();
        
        unsafe{
        println!("{}", *p1.offset(0) as u8);//should get 17, but I get 0
        println!("{}", *p2.offset(0) as char);
        }
}

这里是游乐场的链接。 https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=18222645e5fa43cde787659402962be3

【问题讨论】:

    标签: rust


    【解决方案1】:

    指针并不拥有它们所指向的东西,所以当你这样做时:

    let p1 : *const u8 = vec![17u8,2u8].as_ptr();
    

    发生的事件顺序是:

    • 构造了一个Vec,并在堆上分配了一个缓冲区
    • 调用as_ptr(),返回指向缓冲区的指针
    • Vec 被删除,因为没有任何东西拥有它,所以缓冲区被释放
    • 当您稍后取消引用指针时,您正在调用未定义的行为

    第二种情况正常:

    let p2 : *const u8 = "123".as_ptr();
    

    因为“123”是一个字符串字面量,而字符串字面量有'static 的生命周期——它们的持续时间与程序本身一样长。

    【讨论】:

      【解决方案2】:

      这是一个工作版本。

      fn main() {
              let data = vec![17u8,2u8];
              let p1 : *const u8 = data.as_ptr();
              let p2 : *const u8 = "123".as_ptr();
              
              unsafe{
              println!("{}", *p1.offset(0) as u8); // not get 17 instead of 0
              println!("{}", *p2.offset(0) as char);
              }
      }
      

      不知道为什么要提取vec来分离变量

      【讨论】:

        猜你喜欢
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-23
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 2022-01-08
        相关资源
        最近更新 更多