На первый взгляд можно сделат так, как написано в
книжке, однако у меня возникает вопрос каким образом выделяется память под строку в примере? Нужно ли делать free в коде, который эту строку получает? Спрашиваю, поскольку у меня часто в получателе часть строки портилась, особенно если строка была длинной (быть может и дефект на nightly).
Я пришел к какому-то такому устойчиво работающему решению, но оно как-то странно выглядит:
(место под out выделено в C коде, который вызывает эту функцию)
#[no_mangle]
pub extern fn rs_string_in_string_out(s_raw: *const c_char, out: *mut c_char) -> c_int {
// take string from the input C string
if s_raw.is_null() { return 0; }
let c_str: &CStr = unsafe { CStr::from_ptr(s_raw) };
let buf: &[u8] = c_str.to_bytes();
let str_slice: &str = std::str::from_utf8(buf).unwrap();
let str_buf: String = str_slice.to_owned();
//produce a new string
let result = String::from(str_buf + " append from Rust");
let len = result.len();
//create C string for output
let c_result = CString::new(result);
//write string into out pointer passed by C++ addon
unsafe{ std::ptr::copy(c_result.unwrap().as_ptr(), out, len); };
// return result length
return len as c_int;
}