[−][src]Function tao_of_rust::ch13::non_null_pointer::non_null_intro
pub fn non_null_intro()
NonNull指针
NonNull<T>
旨在成为Unsafe Rust
默认的原生指针
Basic usage: NonNull内置方法展示
允许开发者更安全地使用原生指针
use std::ptr::{null, NonNull}; fn main(){ let ptr : NonNull<i32> = NonNull::dangling(); println!("{:p}", ptr); // 0x4 let mut v = 42; let ptr : Option<NonNull<i32>> = NonNull::new(&mut v); println!("{:?}", ptr); // Some(0x7fff73406a78) println!("{:?}", ptr.unwrap().as_ptr()); // 0x7fff73406a78 println!("{}", unsafe{ptr.unwrap().as_mut()}); // 42 let mut v = 42; let ptr = NonNull::from(&mut v); println!("{:?}", ptr); // 0x7fff73406a7c let null_p: *const i32 = null(); let ptr = NonNull::new(null_p as *mut i32); println!("{:?}",ptr); // None }Run
use std::mem; use std::ptr::NonNull; struct Foo { a: *mut u64, b: *mut u64, } struct FooUsingNonNull { a: *mut u64, b: NonNull<*mut u64>, } fn main() { println!("*mut u64: {} bytes", mem::size_of::<*mut u64>()); println!("NonNull<*mut u64>: {} bytes", mem::size_of::<NonNull<*mut u64>>()); println!("Option<*mut u64>: {} bytes", mem::size_of::<Option<*mut u64>>()); println!("Option<NonNull<*mut u64>>: {} bytes", mem::size_of::<Option<NonNull<*mut u64>>>()); println!("Option<Foo>: {} bytes", mem::size_of::<Option<Foo>>()); println!("Option<FooUsingNonNull>: {} bytes", mem::size_of::<Option<FooUsingNonNull>>()); }Run