ptr::read() 与 ptr::write() 函数

这两个函数用于从原始指针读取当前值以及向其写入新的值. 要注意的是, 不管 T 有没有实现 Copy trait, read() 这个操作都可以完成, 因为它是字节级别的拷贝.

pub const unsafe fn read<T>(src: *const T) -> T;
pub unsafe fn write<T>(dst: *mut T, src: T);

这两个函数是 Rust 操作内存的基础, 像标准库中的 ptrmem 模块中的函数, 很多都是利用这两个函数实现的.

要使用它们, 需要先满足前置条件, 不然对指针的操作就会出现未定义行为:

  • 原始指针必须是有效指针
  • 原始指针应该是内存对齐的, 如果没有对齐, 可以考虑 read_unaligned()write_unaligned() 函数
  • 对于 read(src), 原始指针必须指向一个被初始化了的地址
use std::ptr;

fn main() {
    let mut s = 42;

    unsafe {
        let s2 = &mut s as *mut i32;
        let num = ptr::read(s2);
        assert_eq!(num, 42);
        ptr::write(s2, num + 1);
    }

    assert_eq!(s, 43);
}

它类似于下面的C代码:

#include <assert.h>

int main() {
  int s = 42;

  {
    int* s2 = &s;
    int num = *s2;
    assert(num == 42);
    *s2 = num + 1;
  }

  assert(s == 43);
  return 0;
}