Rust在很大程度上理解,任何产生或存储 ZST可以简化为无操作
另一方面,
请注意,对ZST(包括空切片)的引用,就像所有 其他引用,必须是非空的,并适当地对齐.解引用 指向ZST的空指针或未对齐指针是未定义行为,就像 对于任何其他类型.
这两段话对我来说似乎有点矛盾.请考虑以下示例:
fn main() {
let null_ptr = ptr::null_mut::<()>();
unsafe { *null_ptr = () }
}
它在rustc 1.75.0
以下编译和运行得很好,但是代码的行为是否定义良好?
一方面它应该是无操作的,所以可能没有任何问题,另一方面有null
个指针的取消引用,这是UB.
Note:我在这里try 使用空指针的原因是,分配器可能会为ZST分配一些非零大小的内存,这在我的特定环境中是不被接受的.