据我了解,在Rust中创建空指针的标准(唯一方法)是std::ptr::null
。
但是,该函数声明如下。
pub const fn null<T>() -> *const T
在此声明中,
T
隐式假定为具有固定大小(否则为T: ?Sized
)。因此,不可能将此功能与*const str
或*const [u32]
一起使用。 test it in the playground是否有充分的理由排除未调整大小的类型?想要创建一个空的
*const str
有什么问题?
最佳答案
指向无大小类型的指针是一个胖指针,具有两个组成部分:指针和类型元数据(切片的长度,以及特征对象的vtable指针;将来,Rust可能会允许其他类型的元数据)。 null
仅暗示指针部分的值;没有其他选择的明显选择。 (您可能会认为空切片指针的长度很明显为0,我可以看到该参数,但是如果指针为null,则几乎没有关系有多少东西;无论如何您都无法取消引用它,因此请确定其大小为了确保安全,没有必要将其设置为0。)
无法创建指向特征对象的空指针,但是从Rust 1.42开始,您可以使用 ptr::slice_from_raw_parts
创建指向切片的空指针。假设切片的长度为0:
use std::ptr;
fn main() {
let p: *const [u32] = ptr::slice_from_raw_parts(ptr::null(), 0);
println!("{:?}", p);
}
str
没有等效的功能,但是您可以通过创建一个空的*const [u8]
并使用as
进行强制转换来实现。此函数(或相关的
slice_from_raw_parts_mut
)是正确创建指向切片的空指针的唯一方法。获取原始指针的通常方法是通过强制转换引用,但是引用永远不能为空。
关于pointers - 为什么 `std::ptr::null`无法用于未定义大小的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61355230/