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