녹을 C 코드로 포팅하기 시작했지만 녹이 어떻게 작동하는지 혼란 스럽습니다.Rust에서 C 이중 포인터와 동일한 기능을 수행하려면 어떻게해야합니까?
typedef struct Room {
int xPos;
int yPos;
} Room;
void main(){
Room **rooms;
rooms = malloc(sizeof(Room)*8);
}
녹을 C 코드로 포팅하기 시작했지만 녹이 어떻게 작동하는지 혼란 스럽습니다.Rust에서 C 이중 포인터와 동일한 기능을 수행하려면 어떻게해야합니까?
typedef struct Room {
int xPos;
int yPos;
} Room;
void main(){
Room **rooms;
rooms = malloc(sizeof(Room)*8);
}
는 "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);
을 C는 대 나는 C 이중 포인터의 동등한 녹의 장점
하나를 어떻게해야합니까 C에서, 당신은 foo_t **
의 의미를 모른다. 각 포인터를 누가 해제해야합니까? 어느 포인터가 변경 가능합니까? 녹 포인터에서 원시 포인터를 만들 수도 있지만 그 경우에도 가변성을 지정해야합니다. 이 당신이을 원하는 거의 결코 : 그것은 전달 된 포인터를 수정하고 싶어하기 때문에 특정 FFI의 경우
let rooms: *mut *mut Room;
는, C 함수가 foo_t **
을 받아들입니다. 이러한 경우 합리적인 것입니다.
unsafe {
let mut room: *mut Room = std::mem::uninitialized();
let room_ptr: *mut *mut Room = &mut room;
}
감사합니다. 나는 이것을 시도 할 것이다. – Jeriel
어 ... 그 C 코드가 잘못되었습니다. sizeof (Room)에'*'가 누락 된 것 같아요? (그래서 당신은 언제나'(sizeof * rooms)'대신에'btw) – trentcl
을 써야만한다. "이중 C 포인터는 어떻게 얻는가?"라는 질문은 그다지 유용하지 않다. 왜냐하면 그것은 C의 특징이고 Rust는 자신의 일을하는 방식을 가지기 때문이다. . 그것은 할 수 있지만 끔찍한 코드가 될 것입니다. 대신 실제로 얻고 자하는 것이 무엇이든 물어보십시오 (예 : "힙에 동적 객체 배열을 만드는 방법"). – interjay
@trentcl 고마워, 네 말이 맞아. – Jeriel