将指针存储为另一个指针的值的最佳方法是什么?
我有一个ptr类型为的变量*mut u8。如何将ptr指向的地址存储为另一个t类型也是的指针的值*mut u8。
我正在尝试做类似的事情
*t = ptr;
Run Code Online (Sandbox Code Playgroud)
我expected u8, found *-ptr出错了。我了解该地址ptr将为64位。我想填充从address开始的64位t。
我有一个
ptr类型为的变量*mut u8。如何将ptr指向的地址存储为另一个t也是类型的指针的值*mut u8
将一个指针分配给另一个指针:
use std::ptr;
fn main() {
let ptr: *mut u8 = ptr::null_mut();
let t: *mut u8 = ptr;
}
Run Code Online (Sandbox Code Playgroud)
ptr是一个指针,它指向的地址是NULL。现在,此值存储在t与以下类型相同的指针中ptr:t指向地址NULL。
use std::ptr;
fn main() {
let ptr: *mut u8 = ptr::null_mut();
let t: *mut u8 = ptr;
}
Run Code Online (Sandbox Code Playgroud)
如果要t成为另一个指针的地址的指针,则需要引用ptr。类型也不能相同:
use std::ptr;
fn main() {
let ptr: *mut u8 = ptr::null_mut();
let t: *const *mut u8 = &ptr;
}
Run Code Online (Sandbox Code Playgroud)
+-----+ +-----+
| | | |
| ptr | | t |
| | | |
+--+--+ +--+--+
| |
| |
+---->NULL<----+
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种写
ptr指向特定位置的地址的方法,这样即使我没有地址也可以得到该地址t
原始指针没有与编译器强制关联的生存期。如果您想在值消失后保留某些地址,这对他们来说是一个理想的情况-您无需做任何事情:
use std::ptr;
fn do_not_dereference_this_result() -> *const u8 {
let val: u8 = 127;
let ptr: *const u8 = &val;
ptr
}
fn main() {
println!("{:p}", do_not_dereference_this_result())
}
Run Code Online (Sandbox Code Playgroud)
在极少数情况下,您可能希望将地址存储在usize(指针大小的整数值)中:
use std::ptr;
fn do_not_dereference_this_result() -> usize {
let val: u8 = 127;
let ptr: *const u8 = &val;
ptr as usize
}
fn main() {
println!("{:x}", do_not_dereference_this_result())
}
Run Code Online (Sandbox Code Playgroud)
这真的听起来像你通过指针如何工作,这是一个非常好的迹象,你是要拍自己的脚,如果你使用它们混淆。我强烈建议您在任何重要的代码中单独使用引用,直到您对指针的理解有所提高。