在Rust中应该如何进行指针运算?
我知道答案是“你不应该”。。。但是为了争论,你应该怎么做呢 例如,如果您想编写一个不同于在Rust中应该如何进行指针运算?,rust,Rust,我知道答案是“你不应该”。。。但是为了争论,你应该怎么做呢 例如,如果您想编写一个不同于Vec的替代方案 我发现您可以通过将*mut T值转换为u64并添加到它们中,然后将它们转换回*mut并读取指针处的值来制作“编译和运行的东西”(见下面的示例)。这似乎是可行的,但也留下了一些悬而未决的问题: *mut T指针是否始终适合u64 当数据是来自libc:calloc的任意(即非托管类型)数据块时,写入不安全指针是否会触发指针别名问题 这只会起作用,因为我使用的是基元类型(f64)。如果这是一个真
Vec
的替代方案
我发现您可以通过将*mut T
值转换为u64
并添加到它们中,然后将它们转换回*mut
并读取指针处的值来制作“编译和运行的东西”(见下面的示例)。这似乎是可行的,但也留下了一些悬而未决的问题:
*mut T
指针是否始终适合u64
libc:calloc
的任意(即非托管类型)数据块时,写入不安全指针是否会触发指针别名问题f64
)。如果这是一个真实的数据对象,我必须先忘记();但是,如果类型复杂且有子记录,您能简单地将()写入目标,然后愉快地读取()吗
ptrtoint()
/inttoptr()
对,但我找不到类似的东西fn main() {
let items = [1usize, 2, 3, 4];
let ptr = &items[1] as *const usize;
println!("{}", unsafe { *ptr });
println!("{}", unsafe { *ptr.offset(-1) });
println!("{}", unsafe { *ptr.offset(1) });
}
输出
2
1.
3.
您可能应该使用
items.as_ptr()
来获取指针,当然您的方法也可以。。。
fn main() {
let items = [1usize, 2, 3, 4];
let ptr = &items[1] as *const usize;
println!("{}", unsafe { *ptr });
println!("{}", unsafe { *ptr.offset(-1) });
println!("{}", unsafe { *ptr.offset(1) });
}