当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust CString用法及代码示例


本文简要介绍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]切片从CStringstd::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-lang.org大神的英文原创作品 Struct std::ffi::CString。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。