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]?
解答
输出内容的含义
这是切片y当前指向的剩余未写入内存区域。两次write操作共写入2字节,原本长度为10的切片y,起始指针会向后移动2位,现在指向原始数组第3个元素(索引2)开始的8个元素,这部分未被修改,所以打印出8个初始值0。通过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]。
- 打印该内容的原因
Writetrait的write方法会修改切片本身:每次成功写入后,切片的起始位置会向前移动已写入的字节数,剩余长度相应减少。两次write后,y的有效范围已经变成原始数组中未被写入的后8个元素,{:?}格式化打印的就是当前切片覆盖的内存内容,所以输出8个0。而{:p}打印的是y当前起始位置的指针,也就是数组索引2处的内存地址。
内容的提问来源于stack exchange,提问作者Kanwar Baweja
相关产品推荐
相关产品推荐

