我开始将C代码移植到Rust,但我对Rust的工作原理感到困惑。这段代码的等价物是什么:
typedef struct Room {
int xPos;
int yPos;
} Room;
void main (){
Room **rooms;
rooms = malloc(sizeof(Room)*8);
}
这段代码的等价物是什么
假设你的意思是“一个容量为8的Room
s集合”:
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;
}