2014-08-28 2 views
0

Я пытаюсь преобразовать этот простой код C в Руст:C-подобный указатель в структуре

#include <stdio.h> 

struct n { 
     int *p; 
}; 

int main(void) { 
    int i = 8; 
    struct n m; 

    m.p = &i; 

    printf("%d ", i); 
    printf("%d", *(m.p)); 

    return 0; 
} 

Выход «8 8».

Нет необходимости в сборке мусора или других указателях, о которых я читал.

Я попытался это:

struct n { 
    p: *mut int 
} 

fn main() { 
    let mut i: int = 8; 
    let mut m: n; 

    m.p = &i; 

    println!("{} ", i); 
    println!("{}", *(m.p)); 
} 

Но я получаю:

error: mismatched types: expected `*mut int`, found `&int` (expected *-ptr, found &-ptr). 

Относительно этой ошибки:

m.p = &i; 

Там нет ошибок для других линий.

Я прочитал, что & должен получить адрес переменной, но как я могу сохранить адрес?

ответ

0

Изменение m.p = &i; в m.p = &mut i as *mut _;

Более идиоматических способ был бы это, хотя:

let mut m = n { 
    p: &mut i 
}; 

И еще идиоматическое бы не с использованием исходного указателя, если это необходимо.

struct N<'a> { 
    p: &'a mut int 
} 
+0

структура п { \t р: & ают INT } это дает ошибку "отсутствует спецификатор пожизненную" – Jimmay

+0

Т.пл = & аю я, как * аю _; это дает ошибку «разыменование небезопасного указателя требует небезопасной функции или блока» – Jimmay

+0

Потенциально небезопасный код должен быть помещен в небезопасный блок: 'unsafe {...}'. Это не назначение, которое небезопасно, но позже. –

Смежные вопросы