Pointers 将指针的值存储在Rust中的另一个指针中
将指针存储为另一个指针的值的最佳方法是什么 我有一个类型为Pointers 将指针的值存储在Rust中的另一个指针中,pointers,rust,Pointers,Rust,将指针存储为另一个指针的值的最佳方法是什么 我有一个类型为*mut u8的变量ptr。如何将ptr指向的地址存储为另一个指针t的值,该指针也是*mut u8类型 我正在尝试做一些类似的事情 *t = ptr; 我得到预期的u8,发现*-ptr错误。我知道地址ptr将为64位。我想从addresst开始填充64位。您通常不想这样做,但我相信您知道自己在做什么 这里的关键是要理解以下几点: Box大致相当于堆上分配的*T,您可以使用Box::into_raw将其转换为*T 如果这样做,实际上就是
*mut u8
的变量ptr
。如何将ptr
指向的地址存储为另一个指针t
的值,该指针也是*mut u8
类型
我正在尝试做一些类似的事情
*t = ptr;
我得到
预期的u8,发现*-ptr
错误。我知道地址ptr
将为64位。我想从addresst
开始填充64位。您通常不想这样做,但我相信您知道自己在做什么
这里的关键是要理解以下几点:
大致相当于堆上分配的Box
,您可以使用*T
将其转换为Box::into_raw
*T
- 如果这样做,实际上就是泄漏堆分配的
,因为Rust不再知道它在哪里,也不再跟踪它。您必须在某个点手动将其转换回可拖放对象,例如使用框
Box::from_raw
- 您必须
一个值,以确保将其放入堆中,否则原始指针将指向堆栈,这最终将变得无效Box::new(…)
- 可变别名(这意味着两个
指向相同的数据)会导致未定义的行为。理解对可变别名的并发写入不会触发未定义的行为是非常重要的。。。它是由以下因素触发的&mut T
let foo_ref = Box::into_raw(Box::new(10));
let foo_ref_ref = Box::into_raw(Box::new(foo_ref));
// Modify via raw pointer
unsafe {
**(foo_ref_ref as *const *mut i32) = 100;
}
// Read via raw pointer
unsafe {
println!("{:?}", **foo_ref_ref);
}
// Resolve leaked memory
unsafe {
Box::from_raw(foo_ref_ref);
Box::from_raw(foo_ref);
}
你通常不想这么做,但我相信你知道你在做什么 这里的关键是要理解以下几点:
大致相当于堆上分配的Box
,您可以使用*T
将其转换为Box::into_raw
*T
- 如果这样做,实际上就是泄漏堆分配的
,因为Rust不再知道它在哪里,也不再跟踪它。您必须在某个点手动将其转换回可拖放对象,例如使用框
Box::from_raw
- 您必须
一个值,以确保将其放入堆中,否则原始指针将指向堆栈,这最终将变得无效Box::new(…)
- 可变别名(这意味着两个
指向相同的数据)会导致未定义的行为。理解对可变别名的并发写入不会触发未定义的行为是非常重要的。。。它是由以下因素触发的&mut T
let foo_ref = Box::into_raw(Box::new(10));
let foo_ref_ref = Box::into_raw(Box::new(foo_ref));
// Modify via raw pointer
unsafe {
**(foo_ref_ref as *const *mut i32) = 100;
}
// Read via raw pointer
unsafe {
println!("{:?}", **foo_ref_ref);
}
// Resolve leaked memory
unsafe {
Box::from_raw(foo_ref_ref);
Box::from_raw(foo_ref);
}
我有一个类型为*mut u8
的变量ptr
。如何将ptr
指向的地址存储为另一个指针t
的值,该指针也是*mut u8
将一个指针分配给另一个指针:
use std::ptr;
fn main() {
let ptr: *mut u8 = ptr::null_mut();
let t: *mut u8 = ptr;
}
ptr
是一个指针,它指向的地址是NULL
。该值现在存储在与ptr
类型相同的指针t
中:t
指向地址NULL
+----++-----+
| | | |
|ptr | | t|
| | | |
+--+--+ +--+--+
| |
| |
+---->空ptr+------>空
| | | |
+-----+ +-----+
我正在寻找一种方法来写入
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())
}
在少数情况下,您可能希望将地址存储在usize
(指针大小的整数值)中:
听起来你真的对指针的工作原理感到困惑,这是一个很好的迹象,如果你使用指针,你会射中自己的脚。我强烈地鼓励您在任何重要代码中单独使用引用,直到您对指针的理解有所提高 我有一个类型为
*mut u8
的变量ptr
。如何将ptr
指向的地址存储为另一个指针t
的值,该指针也是*mut u8
将一个指针分配给另一个指针:
use std::ptr;
fn main() {
let ptr: *mut u8 = ptr::null_mut();
let t: *mut u8 = ptr;
}
ptr
是一个指针,它指向的地址是NULL
。该值现在存储在与ptr
类型相同的指针t
中:t
指向地址NULL
+----++-----+
| | | |
|ptr | | t|
| | | |
+--+--+ +--+--+
| |
| |
+---->空ptr+------>空
| | | |
+-----+ +-----+
我正在寻找一种方法来写入
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())
}
在少数情况下,您可能希望将地址存储在usize
(指针大小的整数值)中:
听起来你真的对指针的工作原理感到困惑,这是一个很好的迹象,如果你使用指针,你会射中自己的脚。我强烈地鼓励您在任何重要代码中单独使用引用,直到您对指针的理解有所提高。您是否尝试过分配