参考堆

在阅读了关于The Heap和Stack (Rust-lang)的几篇文章后,我了解到非原始类型/数据结构通常位于堆上,在堆栈中留下一个指针,指向特定对象所在的地址在堆上。

堆值由堆栈中的变量引用,其中包含堆中对象的内存地址。 [Rust Essentials,Ivo Balbaert]

考虑下面的例子:

struct Point {
    x: u32,
    y: u32,
}

fn main() {
    let point = Point { x: 8, y: 16 };

    // Is this address the value of the pointer at the stack, which points to
    // the point-struct allocated in the heap, or is the printed address the 
    // heap-object's one?
    println!("The struct is located at the address {:p}", &point);
}

在我的情况下,输出是:

该结构位于地址0x24fc58

那么, 0x24fc58是堆栈引用指向的值(地址),还是堆结构实例在堆中分配的直接内存地址?

一些额外的小问题:

  • 这是一个“原始地址”还是与程序地址空间相关的地址?
  • 是否可以通过直接传递一个十六进制地址来初始化一个指针?
  • 是否可以访问不在程序地址空间中的内存地址?

  • 你的Point实际上驻留在堆栈上 - 没有Box或其他结构可以放在堆上。

    是的,可能(虽然明显不安全)将地址传递给*ptr (这是一个空指针)并将其转换为&ptr - 这是不安全的,因为后者保证为非空。

    因此,只要底层系统允许你这样做(当前大多数系统可能只是通过分段错误来终止你的进程),它当然可能(尽管非常不安全)访问非堆内存。

    链接地址: http://www.djcxy.com/p/14509.html

    上一篇: Reference of a Heap

    下一篇: Concurrent Programming, Stacks and Heaps in C/C++