當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。