【问题标题】:Raw pointers w/o unsafe没有不安全的原始指针
【发布时间】:2023-01-08 11:49:00
【问题描述】:

要取消引用原始指针,我们必须使用 unsafe 代码。在什么情况下可以以完全不涉及使用 unsafe 代码的方式使用(并且可能有用)原始指针?

【问题讨论】:

  • “完全安全的上下文”是什么意思?你是说它是好听的吗?标准库中充满了原始指针。
  • @ChayimFriedman 我想我使用的表达方式不正确,所以我编辑了我的问题。
  • @ChayimFriedman 我没有需要解决的特定问题。我只是在学习,想对此事有更好的了解。
  • 例如,当遍历 Arcs 的图时,您可以使用原始指针作为对象标识。
  • 指针应该是……指向对象的指针。如果你可以用他们做不需要unsafe 的事情,恭喜,但这不是他们的目的。

标签: pointers rust


【解决方案1】:

您几乎唯一可以做的就是将原始指针转换为 usize。您可以使用它来做一些事情,比如从对数组的引用获取数组中的索引。

fn get_index_in_array(array: &[i32], item: &i32) -> usize {
    let array_ptr: *const i32 = array.as_ptr();
    let item_ptr: *const i32 = item;
    
    let distance = ((item_ptr as usize) - (array_ptr as usize)) / std::mem::size_of::<i32>();
    assert!(distance < array.len());
    distance
}

fn main() {
    let arr = [1, 2, 3, 4];
    
    println!("{}", get_index_in_array(&arr, &arr[2]));
}
2

【讨论】:

    【解决方案2】:

    当您在不同语言之间创建互操作时,会大量使用原始指针。例如,如果您尝试将引用从 rust 传递到 javascript

    在这种情况下,您使用原始指针

    pub fn snake(&self)->*const GameCell{
            // as_ptr is the reference to the first item in the vector
            self.snake.body.as_ptr()
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2019-08-25
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多