pub macro addr_of($place:expr) { ... }
Expand description
Create a const
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, &expr as *const _
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.
Note, however, that the expr
in addr_of!(expr)
is still subject to all
the usual rules. In particular, addr_of!(*ptr::null())
is Undefined
Behavior because it dereferences a null pointer.
Example
use std::ptr;
#[repr(packed)]
struct Packed {
f1: u8,
f2: u16,
}
let packed = Packed { f1: 1, f2: 2 };
// `&packed.f2` would create an unaligned reference, and thus be Undefined Behavior!
let raw_f2 = ptr::addr_of!(packed.f2);
assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);
RunSee addr_of_mut
for how to create a pointer to unininitialized data.
Doing that with addr_of
would not make much sense since one could only
read the data, and that would be Undefined Behavior.