See the playground:
use rand::Rng;
fn main() {
let mut data: Vec<*const u8> = Vec::new();
for _ in 0..5 {
let mut num: Vec<u8> = Vec::new();
for _ in 0..16 {
let rand_num: u8 = rand::thread_rng().gen();
num.push(rand_num)
}
println!("num is : {:?},num.as_ptr(): {:?}", num, num.as_ptr());
data.push(num.as_ptr());
}
println!("data is: {:?}", data);
}
Output:
num is : [115, 9, 190, 41, 30, 145, 128, 236, 142, 72, 240, 195, 214, 151, 9, 56],num.as_ptr(): 0x56330649ab80
num is : [10, 50, 15, 18, 31, 157, 18, 191, 208, 180, 224, 240, 82, 110, 79, 222],num.as_ptr(): 0x56330649ab80
num is : [239, 194, 216, 2, 198, 65, 189, 31, 146, 16, 181, 40, 154, 240, 186, 211],num.as_ptr(): 0x56330649ab80
num is : [57, 238, 33, 9, 181, 83, 230, 200, 185, 184, 196, 102, 4, 218, 57, 141],num.as_ptr(): 0x56330649ab80
num is : [131, 44, 55, 233, 162, 115, 243, 237, 170, 201, 93, 161, 31, 192, 147, 0],num.as_ptr(): 0x56330649ab80
data is: [0x56330649ab80, 0x56330649ab80, 0x56330649ab80, 0x56330649ab80, 0x56330649ab80]
Why the addresses are all same?
I altered it:
use rand::Rng;
fn main() {
let mut data :Vec<* const [u8]> = Vec::new();
for _i in 0..5 {
let mut num: Vec<u8>= Vec::new();
for _j in 0..16 {
let rand_num :u8 = rand::thread_rng().gen();
num.push(rand_num);
}
println!("num({:?}/{:p}) is : {:?}", num.as_ptr(), &*num, num);
let boxed = num.into_boxed_slice();
data.push(Box::into_raw(boxed) as _);
}
println!("data is: {:?}",data);
}
It seems the Box::into_raw
is the key?