本文簡要介紹rust語言中 std::ffi::CString.from_raw
的用法。
用法
pub unsafe fn from_raw(ptr: *mut c_char) -> CString
重新獲得通過 CString::into_raw
轉移給 C 的 CString
的所有權。
此外,字符串的長度將從指針重新計算。
安全性
隻能使用先前通過調用 CString::into_raw
獲得的指針來調用它。其他用法(例如,嘗試獲取由外部代碼分配的字符串的所有權)可能會導致未定義的行為或分配器損壞。
應該注意的是,長度不僅僅是“recomputed,”,而是重新計算的長度必須與 CString::into_raw
調用的原始長度相匹配。這意味著在將字符串傳遞給可以修改字符串長度的 C 函數時,不應使用 CString::into_raw
/from_raw
方法。
注意:如果您需要借用外部代碼分配的字符串,請使用std::ffi::CStr.如果您需要獲得由外部代碼分配的字符串的所有權,您將需要製定自己的規定以適當地釋放它,可能使用外部代碼的 API 來執行此操作。
例子
創建一個 CString
,將所有權傳遞給 extern
函數(通過原始指針),然後使用 from_raw
重新獲得所有權:
use std::ffi::CString;
use std::os::raw::c_char;
extern "C" {
fn some_extern_function(s: *mut c_char);
}
let c_string = CString::new("Hello!").expect("CString::new failed");
let raw = c_string.into_raw();
unsafe {
some_extern_function(raw);
let c_string = CString::from_raw(raw);
}
相關用法
- Rust CString.from_vec_unchecked用法及代碼示例
- Rust CString.from_vec_with_nul_unchecked用法及代碼示例
- Rust CString.from_vec_with_nul用法及代碼示例
- Rust CString.into_bytes用法及代碼示例
- Rust CString.into_boxed_c_str用法及代碼示例
- Rust CString.into_raw用法及代碼示例
- Rust CString.as_c_str用法及代碼示例
- Rust CString.as_bytes用法及代碼示例
- Rust CString.into_bytes_with_nul用法及代碼示例
- Rust CString.as_bytes_with_nul用法及代碼示例
- Rust CString.new用法及代碼示例
- Rust CString.into_string用法及代碼示例
- Rust CString用法及代碼示例
- 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大神的英文原創作品 std::ffi::CString.from_raw。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。