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位。我想从address
t
开始填充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
(指针大小的整数值)中:


听起来你真的对指针的工作原理感到困惑,这是一个很好的迹象,如果你使用指针,你会射中自己的脚。我强烈地鼓励您在任何重要代码中单独使用引用,直到您对指针的理解有所提高。

您是否尝试过分配