我如何使Rust的C双指指针等效

  • 本文关键字:指针 何使 Rust pointers rust
  • 更新时间 :
  • 英文 :


我开始将C代码移植到生锈,但是我对在Rust中的工作方式感到困惑。该代码的等效是什么:

typedef struct Room {
    int xPos;
    int yPos;
} Room;
void main (){
  Room **rooms;
  rooms = malloc(sizeof(Room)*8);
}

此代码的等效

是什么

假设您的意思是" 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 double指针等效

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

let rooms: *mut *mut Room;

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

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

最新更新