macro_rules! raw_mut { ($e:expr) => { ... }; }
Create a mut
raw pointer to a place, without creating an intermediate reference.
Creating a reference with &
/&mut
is only allowed if the pointer is properly aligned and points to initialized data. For cases where those requirements do not hold, raw pointers should be used instead. However, &mut expr as *mut _
creates a reference before casting it to a raw pointer, and that reference is subject to the same rules as all other references. This macro can create a raw pointer without creating a reference first.
#![feature(raw_ref_macros)] use std::ptr; #[repr(packed)] struct Packed { f1: u8, f2: u16, } let mut packed = Packed { f1: 1, f2: 2 }; // `&mut packed.f2` would create an unaligned reference, and thus be Undefined Behavior! let raw_f2 = ptr::raw_mut!(packed.f2); unsafe { raw_f2.write_unaligned(42); } assert_eq!({packed.f2}, 42); // `{...}` forces copying the field instead of creating a reference.
© 2010 The Rust Project Developers
Licensed under the Apache License, Version 2.0 or the MIT license, at your option.
https://doc.rust-lang.org/std/ptr/macro.raw_mut.html