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

时间:2017-12-19 00:05:42

标签: pointers rust

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

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

void main (){
  Room **rooms;
  rooms = malloc(sizeof(Room)*8);
}

1 个答案:

答案 0 :(得分:1)

  

此代码的等效内容

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

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

fn main() {
    let rooms: Vec<Room> = Vec::with_capacity(8);
}

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

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

let rooms: Vec<Box<Room>> = Vec::with_capacity(8);
  

如何制作等效的C双指针

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

let rooms: *mut *mut Room;

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

unsafe {
    let mut room: *mut Room = std::mem::uninitialized();
    let room_ptr: *mut *mut Room = &mut room;
}