我有一个 FFI 函数,它分配并返回一个指向已知长度数组的
以下是我的变量:
*mut::std::os::raw::c_char
。我还有一个 Rust 字符串 s:&str
。我只想将 s
的内容复制到字符指针中添加空字节,就像 C 中的 strcpy()
一样,但我找不到用 Rust 实现这个操作的简洁方法。如果可能的话,我希望在只进行一次拷贝的情况下完成操作,而不需要中间分配,但如果这不可能,那也没关系。以下是我的变量:
let ptr: *mut ::std::os::raw::c_char;
let s: &str;
我已经考虑过:
std::ffi::CStr::from_ptr
用于创建表示分配内存的CStr
,但这似乎是不可变的- 使用
CString
,但这似乎是为 Rust "拥有" 的字符串而设计的,所以我不确定它是否适用于这里,当 Rust 不负责释放此数组时 - 我可以使用
std::slice::from_raw_parts_mut
从ptr
创建一个可变切片,但这有点低级,我希望有一种更高级的字符串操作选项,可以为我添加 null,而不是让我自己添加
有没有一种优雅的方法来解决这个问题?
ptr
转换为字符串,你应该将字符串转换为指针,从中使用std::ptr::copy
复制到指针,然后显式地以空字符结尾。你必须手动终止,因为&str
不是以空字符结尾的,并且强制进行空字符结尾需要原地突变(无法在&str
上完成)或通过CString::new
进行分配。 - Masklinncopy_from_slice
是一个完整指针复制的替代方法,但这需要从ptr
创建一个切片,而这又要求ptr
的目标全部初始化,否则你必须使用MaybeUninit.write_slice
,而这只在夜间版中可用。 - Masklinnstd::ffi::CStr::from_ptr
,然后使用to_bytes_mut
使其可变,接着使用copy_to_nonoverlapping
将字符串复制到其中。在字节切片的末尾手动添加一个空字节。对于简单的任务来说,这听起来像是不必要的转换。 - Jishan Shaikh