如何在 Rust 中创建等效的 C 双指针?

Jer*_*iel 1 pointers rust

我开始将 C 代码移植到 Rust,但我对 Rust 中的工作方式感到困惑。这段代码的等价物是什么:

typedef struct Room {
    int xPos;
    int yPos;
} Room;

void main (){
  Room **rooms;
  rooms = malloc(sizeof(Room)*8);
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 11

这段代码的等价物是什么

假设您的意思是“Room容量为 8的s集合”:

struct Room {
    x_pos: i32,
    y_pos: i32,
}

fn main() {
    let rooms: Vec<Room> = Vec::with_capacity(8);
}
Run Code Online (Sandbox Code Playgroud)

在 Rust 中直接调用分配器是非常罕见的。一般来说,你有一个为你做这件事的集合。您通常也不会明确指定集合的​​项目类型,因为它可以通过您放入的内容推断出来,但是由于您的代码根本不使用rooms,我们必须通知编译器。

正如评论中指出的那样,您不需要双指针。这相当于一个Room *. 如果你真的想要一个额外的间接级别,你可以添加Box

let rooms: Vec<Box<Room>> = Vec::with_capacity(8);
Run Code Online (Sandbox Code Playgroud)

我如何制作等效于 C 双指针

Rust vs C 的好处之一是在 C 中,你不知道foo_t **. 谁应该释放每个指针?哪些指针是可变的?您可以在 Rust 中创建原始指针,但即使这样也需要指定可变性。这几乎永远不是你想要的

let rooms: *mut *mut Room;
Run Code Online (Sandbox Code Playgroud)

在某些 FFI 情况下,C 函数接受 afoo_t **因为它想要修改传入的指针。在这些情况下,这样的事情是合理的:

unsafe {
    let mut room: *mut Room = std::ptr::null_mut();
    let room_ptr: *mut *mut Room = &mut room;
}
Run Code Online (Sandbox Code Playgroud)