Pointers 如何使C双指针等效于Rust?
我开始将C代码移植到Rust,但我对Rust中的工作方式感到困惑。此代码的等效项是什么: typedef结构室{ int XPO; int yPos; }房间; 真空总管{ 房间**房间; 房间=mallocsizeofRoom*8; } 这个代码的等价物是什么 假设您指的是可容纳8人的房间集合: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
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谢谢,您的回答是对的。谢谢!我试试这个。谢谢!我试试这个。