gpt4 book ai didi

pointers - 为什么 `std::ptr::null`无法用于未定义大小的类型?

转载 作者:行者123 更新时间:2023-12-03 11:49:02 25 4
gpt4 key购买 nike

据我了解,在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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com