Rust 为什么将指向u8的原始指针转换为指向8个布尔数组的原始指针不能打印正确的结果?

Rust 为什么将指向u8的原始指针转换为指向8个布尔数组的原始指针不能打印正确的结果?,rust,unsafe,Rust,Unsafe,我在用生锈的原始指针做实验。我有以下代码: fn main() { let mut t: u8 = 0; let addr = &mut t as *mut u8 as usize; let x = addr as *mut [bool; 8]; let y = addr as *mut u8; unsafe { *y = 0b10101010; println!("{:?} {:b}",

我在用生锈的原始指针做实验。我有以下代码:

fn main() {
    let mut t: u8 = 0;

    let addr = &mut t as *mut u8 as usize;

    let x = addr as *mut [bool; 8];

    let y = addr as *mut u8;
    unsafe {
        *y = 0b10101010;
        println!("{:?} {:b}", *x, *y);
    }
}
它生成以下输出:[真,真,真,真,真,真,真,假]10101010 我希望它能打印出[true,false,true,false,true,false,true,false]10101010。
发生了什么事?bool数组不是逐位存储的吗?

该程序的行为未定义,因此输出没有意义。来自Miri:

错误:未定义的行为:内存访问失败:指针必须位于偏移量8的范围内,但超出了alloc1381的范围(大小为1) ->src/main.rs:11:31 | 11 | println!{:?}{:b},*x,*y; |^^内存访问失败:指针必须位于偏移量8的边界内,但超出了alloc1381的边界,该边界的大小为1 | =帮助:这表示程序中存在错误:它执行了无效操作,并导致未定义的行为 =帮助:见https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html 欲知详情
布尔数组是逐字节存储的,而不是逐位存储的。如果您想一点一点地存储,请使用或板条箱。指针无法指向单个位:指针始终指向字节指向位的指针基本上不受任何ISA支持。布尔值的长度为1字节,不能安全地具有0_u8或1_u8以外的任何值。

该程序的行为未定义,因此输出没有意义。来自Miri:

错误:未定义的行为:内存访问失败:指针必须位于偏移量8的范围内,但超出了alloc1381的范围(大小为1) ->src/main.rs:11:31 | 11 | println!{:?}{:b},*x,*y; |^^内存访问失败:指针必须位于偏移量8的边界内,但超出了alloc1381的边界,该边界的大小为1 | =帮助:这表示程序中存在错误:它执行了无效操作,并导致未定义的行为 =帮助:见https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html 欲知详情
布尔数组是逐字节存储的,而不是逐位存储的。如果您想一点一点地存储,请使用或板条箱。指针无法指向单个位:指针始终指向字节指向位的指针基本上不受任何ISA支持。布尔值是1字节长,并且不能安全地具有除了0u8或1uu8以外的任何值。

布尔占据1字节而不是1位,这显示了未定义的行为。您可能会将Rice与C++混淆,其中向量的实现通常是位集。锈不能做到这一点,即使它能IIUC,C++专门化被认为是一个错误,因为它使元素不可寻址,它对其可用性有级联影响。这显示了未定义的行为。你可能会把锈与C++混淆,其中向量的实现通常是针对比特集的。锈不能做到这一点,即使它可以IIUC,C++专业化被认为是一个错误,因为它使元素不可寻址,这对其可用性有级联影响。