当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust addr_of_mut用法及代码示例


本文简要介绍rust语言中 Macro std::ptr::addr_of_mut 的用法。

用法

pub macro addr_of_mut($place : expr) {
    ...
}

创建指向位置的mut 原始指针,而不创建中间引用。

创建参考&/&mut仅当指针正确对齐并指向初始化数据时才允许。对于不满足这些要求的情况,应使用原始指针。然而,&mut expr as *mut _在将其转换为原始指针之前创建一个引用,并且该引用与所有其他引用遵循相同的规则。该宏可以创建一个原始指针没有首先创建一个参考。

但是请注意,addr_of_mut!(expr) 中的expr 仍然遵守所有常规规则。特别是,addr_of_mut!(*ptr::null_mut()) 是未定义行为,因为它取消引用空指针。

例子

创建指向未对齐数据的指针:

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::addr_of_mut!(packed.f2);
unsafe { raw_f2.write_unaligned(42); }
assert_eq!({packed.f2}, 42); // `{...}` forces copying the field instead of creating a reference.

创建指向未初始化数据的指针:

use std::{ptr, mem::MaybeUninit};

struct Demo {
    field: bool,
}

let mut uninit = MaybeUninit::<Demo>::uninit();
// `&uninit.as_mut().field` would create a reference to an uninitialized `bool`,
// and thus be Undefined Behavior!
let f1_ptr = unsafe { ptr::addr_of_mut!((*uninit.as_mut_ptr()).field) };
unsafe { f1_ptr.write(true); }
let init = unsafe { uninit.assume_init() };

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Macro std::ptr::addr_of_mut。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。