У меня есть функция C, которая ожидает *const std::os::raw::c_char
, и я сделал следующее в Rust:
use std::os::raw::c_char;
use std::ffi::{CString, CStr};
extern crate libc;
fn main() {
let _test_str: *const c_char = CString::new("Hello World").unwrap().as_ptr();
let fmt: *const c_char = CString::new("%s\n").unwrap().as_ptr();
unsafe { libc::printf(fmt, _test_str); }
unsafe {
let slice = CStr::from_ptr(_test_str);
println!("string buffer size without nul terminator: {}", slice.to_bytes().len());
}
}
Однако я не могу распечатать _test_str
, и вывод вышеуказанной программы просто
string buffer size without nul terminator: 0
Если я передам _test_str
в какую-нибудь функцию C и увижу, что это пустая строка. Что я сделал не так?
as_ptr
. Мой плохой, но безрассудный слишком много. В любом случае спасибо за указание на ссылку. Кроме того, вопрос, на который вы указали, гораздо более длинный и сложный для понимания ключевого момента. - person xxks-kkk   schedule 05.09.2018unsafe
кода, который вы пишете, включая чтение документации по функциям, которые возвращают необработанные указатели, прежде чем разыменовывать их. Что касается обмана, я согласен, что конкретный немного многословен. На самом деле Как остановить утечку памяти при использованииas_ptr()
? наверное лучше. Тем не менее, я получил только один близкий голос, поэтому я не могу изменить его сейчас. - person trentcl   schedule 05.09.2018