Pointers 如何使C双指针等效于Rust?

Pointers 如何使C双指针等效于Rust?,pointers,rust,Pointers,Rust,我开始将C代码移植到Rust,但我对Rust中的工作方式感到困惑。此代码的等效项是什么: typedef结构室{ int XPO; int yPos; }房间; 真空总管{ 房间**房间; 房间=mallocsizeofRoom*8; } 这个代码的等价物是什么 假设您指的是可容纳8人的房间集合: struct Room { x_pos: i32, y_pos: i32, } fn main() { let rooms: Vec<Room> = Vec::w

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

typedef结构室{ int XPO; int yPos; }房间; 真空总管{ 房间**房间; 房间=mallocsizeofRoom*8; } 这个代码的等价物是什么

假设您指的是可容纳8人的房间集合:

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

fn main() {
    let rooms: Vec<Room> = Vec::with_capacity(8);
}
如何使C双指针等效

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

在某些FFI情况下,C函数接受foo\u t**是因为它想修改传入的指针。在这些情况下,类似这样的情况是合理的:

unsafe {
    let mut room: *mut Room = std::ptr::null_mut();
    let room_ptr: *mut *mut Room = &mut room;
}
这个代码的等价物是什么

假设您指的是可容纳8人的房间集合:

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

fn main() {
    let rooms: Vec<Room> = Vec::with_capacity(8);
}
如何使C双指针等效

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

在某些FFI情况下,C函数接受foo\u t**是因为它想修改传入的指针。在这些情况下,类似这样的情况是合理的:

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

UH那个C代码是错误的。我猜你在Sizeofrom里少了一个*?这就是为什么您应该总是编写sizeof*rooms而不是b思考如何获得双C指针不是很有用,因为这是一个C特性,Rust会有自己的处理方式。这是可以做到的,但会导致可怕的代码。相反,询问您真正想要实现的目标,例如,如何在堆上创建对象的动态数组。@trentcl谢谢,您的回答是对的。嗯。。。那个C代码是错误的。我猜你在Sizeofrom里少了一个*?这就是为什么您应该总是编写sizeof*rooms而不是b思考如何获得双C指针不是很有用,因为这是一个C特性,Rust会有自己的处理方式。这是可以做到的,但会导致可怕的代码。相反,询问您真正想要实现的目标,例如,如何在堆上创建对象的动态数组。@trentcl谢谢,您的回答是对的。谢谢!我试试这个。谢谢!我试试这个。