fn func(s: *mut String, a: *mut i32) -> usize {
println!("{}", unsafe { *s });
println!("{}", unsafe { *a });
unsafe { (*s).len() }
}
fn main() {
let mut s = String::from("hello");
let mut a = 10;
func(&mut s, &mut a);
}
Приведенный выше код не работает с ошибкой:
error[E0507]: cannot move out of dereference of raw pointer
--> src/main.rs:2:29
|
2 | println!("{}", unsafe { *s });
| ^^ cannot move out of dereference of raw pointer
Почему это происходит для String
, а не для i32
? Почему он жалуется на «переезд»?
std::ptr::read
для копирования необработанных строковых данных, но это может легко привести к неопределенному поведению. - person CodesInChaos   schedule 22.12.2017