Я пытаюсь вызвать функцию C в Rust и столкнулся со странной проблемой. Этот код воспроизводит мою проблему:
С
int t(uint8_t *data){
*data = 1;
*(data+1) = 2;
*(data+2) = 3;
}
// block1
unsafe {
let data = Vec::with_capacity(1024).as_mut_ptr();
t(data);
println!("{:?}", Vec::from_raw_parts(data, 4, 4));
}
// block2
unsafe {
let mut data: Vec<u8> = Vec::with_capacity(1024);
let pdata = data.as_mut_ptr();
t(pdata);
println!("{:?}", Vec::from_raw_parts(pdata, 4, 4));
}
Я ожидаю, что вывод будет [1, 2, 3, 0]
.
Только "блок2" работает, "блок1" выводит [91, 57, 49, 44]
. Я понятия не имею, откуда это взялось.
Больше всего сбивает с толку то, что когда я ставлю "блок1" после "блок2" и запускаю их вместе, они оба выводят [1, 2, 3, 0]
правильно.
Что я не заметил? В чем разница между двумя блоками?
Я не могу воспроизвести вашу проблему (у меня это работает). Могу я спросить, как вы определили FFI для t()?
@attdona
extern { fn t(data: libc::uint8_t);}
, и я использую build.rs, чтобы скомпилировать его в статическую библиотеку.Попробуйте
extern "C" { fn t(data: *mut u8); }