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

标签 pointers rust

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

相关文章:

c++ - 基类和派生类之间的不同调试器指针地址

char指针数组赋值

rust - 如何使用 reqwest 执行并行异步 HTTP GET 请求?

c - 释放分配给指针的内存与释放分配给指针指向的内存

c - dreference 一个返回 malloc 指针的函数然后通过 & 传递变量 addres 是否正确?

c++ - C++类中的指针数组

rust - 如何在不移动自身的情况下消除混合 Iterator 和 Futures 调用链的歧义?

rust - 如何将字符串列表缩写为最短、明确的形式

rust - 为什么一个特征没有为一个明确实现的类型实现?

rust - Rust可以存储对 parent 的引用吗?