Ogr*_*mny 3 arrays vector slice rust
我有一个我不明白的问题:
fn cipher_with(key: &[u8], data: &[u8]) -> Vec<u8> {
let data_len = 16;
let mut data = data.to_vec();
data.resize(data_len, 2);
let mut output = Vec::<u8>::with_capacity(data_len);
unsafe { output.set_len(data_len) }
output
}
fn main() {
let key = "blabla".as_bytes();
let data = "lorem ipsum.".as_bytes();
println!("{:?}", cipher_with(&key, &data));
}
Run Code Online (Sandbox Code Playgroud)
这打印:
[108,111,114,101,109,32,105,112,115,117,109,46,0,0,0,0]
但它是如何完成的?我从未给过这个价值output.
要向Peter的答案添加一些细节,请查看这个带注释的版本:
fn cipher_with(key: &[u8], data: &[u8]) -> Vec<u8> {
let data_len = 16;
let mut data = data.to_vec();
println!("{:?}", data.as_ptr());
data.resize(data_len, 2);
println!("{:?}", data.as_ptr());
let mut output = Vec::<u8>::with_capacity(data_len);
println!("{:?}", output.as_ptr());
unsafe { output.set_len(data_len) }
output
}
Run Code Online (Sandbox Code Playgroud)
0x7fa6dba27000
0x7fa6dba1e0c0
0x7fa6dba27000
Run Code Online (Sandbox Code Playgroud)
创建第一个向量时,它的长度为12.当它被调整为16时,将进行新的分配并复制数据.这可能是由于分配器的实现,分配器通常将分配分块到桶中.16将是合理的铲斗尺寸.
当创建第二个向量时,分配器会将第一个向量放弃的相同指针移回.由于没有其他东西同时改变了这个内存,它仍然包含所有数据data.