未能调用 CString::from_raw 将导致内存泄漏。 C 端必须不修改字符串的长度 (通过在字符串内某处写入 null 或删除最后一个),然后使用 CString::from_raw 将其返回到 Rust。 请参见 CString::from_raw 中的安全性部分。 Examples use std::ffi::CString; let c_string = CString::new("foo").expect("CS...
我们可以总结出在 Rust 和 C 之间传递字符串的编程范式。 使用std::ffi::CStr提供的from_ptr方法包装 C 的字符串指针,它基于空字符'\0'来计算字符串的长度,并可以通过它将外部 C 字符串转换为 Rust 的&str和String。 使用std::ffi::CString提供的一对方法into_raw和from_raw可以进行原始指针转换,由于将字符...
2.2 标准库std::ffi模块 由于Rust 语言中字符串与 C 语言字符串的不同之处,标准库std::ffi模块[3]提供了一组实用的程序,主要用于外部函数接口 FFI 的绑定,以及用在与其他语言传递类 C 字符串的代码中。 在支持 C-ABI 的语言(如:Python)中传递 UTF-8 字符串[4]时,CString和CStr很有用。 CStr 在C 语...
use std::process::Command; use std::ffi::OsString; let output = Command::new("some_command") .output()?; let stdout: OsString = OsString::from_vec(output.stdout); (六)处理平台相关的文件编码 如果你的应用程序需要处理平台相关的文件编码,例如在 Windows 上处理 UTF-16 编码的文件名,那么 ...
添加Rust代码:在lib.rs文件中添加你需要的Rust代码。例如:// 在lib.rs中添加你的Rust代码use std::io::{self, Read}; // 导入必要的Rust标准库模块// ... 其他代码 ... //std::ffi::{CStr, CString};use std::os::raw::c_char;#[no_mangle]pub extern "C" fn rust_greeting(to: *const ...
在向FFI函数传递字符串时,应该遵守四个原则: 尽可能延长拥有的字符串的生命周期 尽量减少转换过程中的不安全代码 如果C代码可以修改字符串数据,请使用vec而不是CString 除非外部函数API要求,否则字符串的所有权不应该转移到被调用者身上。 动机 Rust的CString和CStr类型内置了对C风格字符串的支持。然而,对于从Rust函数...
5.CString::new(“Hello world!”).into_raw() 使用std::ffi::CString提供的一对方法into_raw和from_raw可以进行原始指针转换,由于将字符串的所有权转移给了调用者,所以调用者必须将字符串返回给 Rust,以便正确地释放内存。 into_raw()和.as_ptr()的作用类似,都是变成原始指针传给C端。
在Rust 语言中,使用关键字extern可以实现 Rust 语言与其它语言的交互,这是 Rust 外部函数接口 FFI 的基础。 1.1 extern 函数 直接在 Rust 的函数关键字fn前使用关键字extern,可以创建一个允许其他语言调用 Rust 函数的接口。
在这篇文章中,我将讲述我对 Rust 和 FFI 的经验,基于 battery-ffi ,它将 FFI 暴露给我的另一个 crate — battery。我想做的是提供一个 C 接口来创建特定于 Rust 的结构,并能够从它们获取数据。 首先要做的事 你需要将 libc 添加到 crate 的 dependencies 中,并将 crate-type...
而且可能不是UTF-8。如果你需要声明该字符串的所有权,你可以使用.to_owned()来获得CString(分别类似...