我想将一个String传递给Rust lib,但它总是抛出一个分段错误.
这是代码:
// lib.rs #[no_mangle] pub extern fn process(foo: String) -> String { foo }
和Ruby文件:
# embed.rb require 'ffi' module Hello extend FFI::Library ffi_lib 'target/release/libembed.dylib' attach_function :process,[ :string ],:string end puts Hello.process("foo")
解决方法
免责声明:我之前从未使用过Ruby-FFI;我正在继续我在文档中找到的内容.
根据Ruby-FFI wiki page on types,:string相当于NUL终止的C字符串.这与Rust String不同. Rust中的字符串(目前)大三倍!
Rust中相应的类型是* const :: libc :: c_char.值得注意的是,还有std::ffi::CString
,它用于创建C字符串,std::ffi::CStr
是安全的包装类型,可以从CString或* const c_char创建.请注意,这些都不与* const c_char兼容!
总之,要处理Rust中的C字符串,您将不得不处理类型.还要记住,根据您实际尝试的操作,您可能还需要使用libc :: malloc和libc :: free手动管理内存.
This answer to “Rust FFI C string handling”提供了有关如何处理Rust中C字符串的更多详细信息.虽然问题的上下文是与C代码集成,但在您的情况下它应该同样有用.