Как получить изменяемый указатель u32 и привести его к целому указателю C - PullRequest
0 голосов
/ 15 октября 2018

Допустим, у меня есть функция C:

void func(char *buf, unsigned int *len);

Чтобы вызвать ее в Rust, я объявил:

pub fn func(buf: *mut ::std::os::raw::c_char, len: *mut ::std::os::raw::c_uint) {
    unimplemented!()
}

Затем я написал другую оболочку:

pub fn another_func() -> String {
    let mut capacity: u32 = 256;
    let mut vec = Vec::with_capacity(capacity as usize);
    unsafe {
        func(vec.as_ptr() as *mut c_char, &capacity as *mut c_uint)
    };
    String::from_utf8(vec).unwrap();
    unimplemented!()
}

Но компилятор сказал мне:

error[E0606]: casting `&u32` as `*mut u32` is invalid
   --> src/main.rs:...:28
    |
307 |                                  &capacithy as *mut c_uint)

Почему я не могу привести capacity в *mut c_unit?

1 Ответ

0 голосов
/ 15 октября 2018

Наконец я нашел ответчик, я должен дать ему изменчивый знак:

func(vec.as_ptr() as *mut c_char, &mut capacity as *mut c_uint)
...