本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。