【发布时间】:2016-02-14 08:38:02
【问题描述】:
这个有点相关,但答案对我来说不是很清楚: C library freeing a pointer coming from Rust
书中还有一个example with static string,但是它不能与动态创建的字符串一起正常工作。
我终于找到了这个解决方案,调用 C/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;
}
最好有一些实际返回值,而不是写入可变参数。
【问题讨论】:
-
最好有一些实际返回值的东西 =>你总是可以创建一个包含
char*和size_t的C结构并使用作为返回类型;如果 C 没有一体化的结果并且你必须自己编写它,这几乎不是 Rust 的错。 -
谢谢,马修! C“字符串”末尾有EOF符号就足够了。问题更多是关于解除分配的东西。