2017-12-19 18 views
-3

녹을 C 코드로 포팅하기 시작했지만 녹이 어떻게 작동하는지 혼란 스럽습니다.Rust에서 C 이중 포인터와 동일한 기능을 수행하려면 어떻게해야합니까?

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

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

어 ... 그 C 코드가 잘못되었습니다. sizeof (Room)에'*'가 누락 된 것 같아요? (그래서 당신은 언제나'(sizeof * rooms)'대신에'btw) – trentcl

+4

을 써야만한다. "이중 C 포인터는 어떻게 얻는가?"라는 질문은 그다지 유용하지 않다. 왜냐하면 그것은 C의 특징이고 Rust는 자신의 일을하는 방식을 가지기 때문이다. . 그것은 할 수 있지만 끔찍한 코드가 될 것입니다. 대신 실제로 얻고 자하는 것이 무엇이든 물어보십시오 (예 : "힙에 동적 객체 배열을 만드는 방법"). – interjay

+0

@trentcl 고마워, 네 말이 맞아. – Jeriel

답변

1

는 "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; 
} 
+0

감사합니다. 나는 이것을 시도 할 것이다. – Jeriel