You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust写入可变引用后打印引用出现异常值的技术咨询

Rust切片Write操作后的打印问题解析

原始代码

use std::io::Write;
fn main() {
    let mut x = [0u8; 10];
    let mut y = &mut x[..];
    y.write(b"1");
    y.write(b".");
    println!("{:p}", y);
    println!("{:?}", y);
    println!("{:?}", x);
}

执行输出

0x7ffeddab2b8a
[0, 0, 0, 0, 0, 0, 0, 0]
[49, 46, 0, 0, 0, 0, 0, 0, 0, 0]

问题

  • 打印y时输出的[0, 0, 0, 0, 0, 0, 0, 0]指的是什么?
  • 如何仅通过y打印其底层的完整数据?
  • 为什么会打印出[0,0,0,0,0,0,0,0]?

解答

  1. 输出内容的含义
    这是切片y当前指向的剩余未写入内存区域。两次write操作共写入2字节,原本长度为10的切片y,起始指针会向后移动2位,现在指向原始数组第3个元素(索引2)开始的8个元素,这部分未被修改,所以打印出8个初始值0。

  2. 通过y打印底层完整数据的方法
    要获取原始完整数组,可利用指针偏移结合不安全代码重建完整切片(需自行确保逻辑安全):

// 偏移指针回到原始数组起始位置,重建长度为10的切片
let full_data = unsafe { std::slice::from_raw_parts(y.as_ptr().offset(-2), 10) };
println!("{:?}", full_data);

执行这段代码就能打印出原始数组的完整内容[49, 46, 0, 0, 0, 0, 0, 0, 0, 0]。

  1. 打印该内容的原因
    Write trait的write方法会修改切片本身:每次成功写入后,切片的起始位置会向前移动已写入的字节数,剩余长度相应减少。两次write后,y的有效范围已经变成原始数组中未被写入的后8个元素,{:?}格式化打印的就是当前切片覆盖的内存内容,所以输出8个0。而{:p}打印的是y当前起始位置的指针,也就是数组索引2处的内存地址。

内容的提问来源于stack exchange,提问作者Kanwar Baweja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:48:28