【发布时间】:2018-06-01 11:14:33
【问题描述】:
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?为什么抱怨“搬家”?
【问题讨论】:
-
为什么抱怨“移动”——如果你不知道 Rust 中的“移动”是什么意思,那么你可能不应该使用还没有原始指针。回去重读整本入门书The Rust Programming Language
-
您可以使用
std::ptr::read复制出原始字符串数据,但这很容易导致未定义的行为。
标签: pointers rust borrow-checker ownership-semantics