gpt4 book ai didi

pointers - 如何在 Rust 中制作相当于 C 双指针的东西?

转载 作者:行者123 更新时间:2023-11-29 08:36:20 24 4
gpt4 key购买 nike

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

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

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

最佳答案

What is the equivalent of this code

假设您的意思是“可容纳 8 人的 Room 集合”:

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);

How do I make the equivalent of a C double pointer

Rust 与 C 相比的一个好处是,在 C 中,您不知道 foo_t ** 的语义。谁应该释放每个指针?哪些指针是可变的?您可以在 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;
}

关于pointers - 如何在 Rust 中制作相当于 C 双指针的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47878236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com