在 Rust 中,将 a 转换*const u8为 a*const T是可以的,但取消引用强制转换指针是不安全的,因为指向的内存可能不满足T大小、对齐和有效字节模式的要求。我试图提出一个违反对齐要求的示例,但满足其他两个要求。
因此,我生成一个 7 的随机切片u8,并尝试将不同的长度为 4 的子切片解释为 f32 值。任何字节模式都是有效的 f32 ,而 4 u8 是无效的size_of::<f32>()。因此,唯一变化的是子切片指针的对齐方式,该指针从基本切片偏移:
slice: [ 0 | 1 | 2 | 3 | 4 | 5 | 6 ]
sub-slices: [ 0 1 2 3 ]
[ 1 2 3 4 ]
[ 2 3 4 5 ]
[ 3 4 5 6 ]
Run Code Online (Sandbox Code Playgroud)
这是我运行的代码
use std::mem::transmute;
use std::ptr::read;
use std::convert::TryInto;
//use rand::Rng; …Run Code Online (Sandbox Code Playgroud)