本文简要介绍rust语言中 Struct std::ffi::CString
的用法。
用法
pub struct CString { /* fields omitted */ }
表示拥有的类型,C-compatible,nul-terminated 字符串,中间没有 nul 字节。
这种类型的目的是能够从 Rust 字节切片或向量安全地生成 C-compatible 字符串。这种类型的实例是一个静态保证,即底层字节不包含内部 0 字节 (“nul characters”),并且最终字节为 0 (“nul terminator”)。
CString
与&CStr
的关系就像 String
与&str
的关系一样:每对中的前者都是拥有的字符串;后者是借用的参考文献。
创建CString
CString
是从字节切片或字节向量或任何实现 Into<Vec<u8>>
的东西创建的(例如,您可以直接从 String
或 &str
构建 CString
,因为两者都实现那个特质)。
CString::new
方法实际上会检查提供的&[u8]
中间是否没有 0 字节,如果找到则返回错误。
提取指向整个 C 字符串的原始指针
CString
通过 Deref
特征实现 as_ptr
方法。此方法将为您提供 *const c_char
,您可以将其直接提供给需要 nul-terminated 字符串的外部函数,例如 C 的 strdup()
。注意 as_ptr
返回一个只读指针;如果 C 代码写入它,则会导致未定义的行为。
提取整个 C 字符串的一部分
或者,您可以获得&[u8]
切片从CString
与std::ffi::CString.as_bytes方法。以这种方式生产的切片可以不是包含尾随的 nul 终止符。当您要调用一个需要一个参数的 extern 函数时,这很有用*const u8
参数不一定是nul-terminated,加上另一个带有字符串长度的参数——就像C的一样strndup()
。你当然可以用它得到切片的长度len
方法。
如果您需要一个&[u8]
片和nul 终止符,你可以使用std::ffi::CString.as_bytes_with_nul反而。
一旦获得了所需的切片类型(带有或不带有 nul 终止符),就可以调用切片自己的 as_ptr
方法来获取只读原始指针以传递给外部函数。有关确保原始指针生命周期的讨论,请参阅该函数的文档。
例子
use std::ffi::CString;
use std::os::raw::c_char;
extern "C" {
fn my_printer(s: *const c_char);
}
// We are certain that our string doesn't have 0 bytes in the middle,
// so we can .expect()
let c_to_print = CString::new("Hello, world!").expect("CString::new failed");
unsafe {
my_printer(c_to_print.as_ptr());
}
安全性
CString
用于处理传统的 C 风格字符串(以单个 nul 字节终止的非 nul 字节序列);此类字符串的主要用例是与 C-like 代码进行互操作。通常,您需要将所有权转移到该外部代码或从该外部代码转移所有权。强烈建议您在使用前仔细阅读CString
的文档,因为CString
实例的所有权管理不当可能会导致无效内存访问、内存泄漏和其他内存错误。
相关用法
- Rust CString.into_bytes用法及代码示例
- Rust CString.from_raw用法及代码示例
- Rust CString.into_boxed_c_str用法及代码示例
- Rust CString.into_raw用法及代码示例
- Rust CString.as_c_str用法及代码示例
- Rust CString.from_vec_unchecked用法及代码示例
- Rust CString.from_vec_with_nul_unchecked用法及代码示例
- Rust CString.from_vec_with_nul用法及代码示例
- Rust CString.as_bytes用法及代码示例
- Rust CString.into_bytes_with_nul用法及代码示例
- Rust CString.as_bytes_with_nul用法及代码示例
- Rust CString.new用法及代码示例
- Rust CString.into_string用法及代码示例
- Rust CStr.into_c_string用法及代码示例
- Rust CStr.from_bytes_with_nul用法及代码示例
- Rust CStr.from_bytes_with_nul_unchecked用法及代码示例
- Rust CStr用法及代码示例
- Rust CStr.from_ptr用法及代码示例
- Rust CStr.to_bytes用法及代码示例
- Rust CStr.as_ptr用法及代码示例
- Rust CStr.to_str用法及代码示例
- Rust CStr.to_string_lossy用法及代码示例
- Rust CStr.to_bytes_with_nul用法及代码示例
- Rust Cursor.new用法及代码示例
- Rust Condvar.notify_all用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Struct std::ffi::CString。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。