在 Rust 开发 DLL 时,正确处理 *mut c_char 和 *const c_char 与 String 的转换非常重要。以下是几种常见场景的安全转换方法:
1️⃣ C 字符串 → Rust String
将传入的 *const c_char (C 风格以 null 结尾的字符串) 转换为 Rust 的 String
use std::ffi::CStr;
use std::os::raw::c_char;
#[no_mangle]
pub extern "C" fn process_c_string(c_string_ptr: *const c_char) {
// 安全转换
let rust_str = unsafe {
// 注意:要求传入有效的 C 字符串指针 (null-terminated)
CStr::from_ptr(c_string_ptr)
.to_str() // 转换为 &str
.expect("Invalid UTF-8") // 处理错误
.to_string() // &str → String
};
println!("Rust received: {}", rust_str);
}
安全要点:
- 使用
CStr::from_ptr包装 C 字符串 to_str()处理 UTF-8 转换(可能会失败)- 必须进行错误处理(这里用
expect(),生产环境建议更健壮的方案)
2️⃣ Rust String → C 字符串
将 Rust String 转换为可返回给 C 的 *mut c_char
use std::ffi::CString;
#[no_mangle]
pub extern "C" fn generate_c_string() -> *mut c_char {
let rust_string = "从 Rust 生成的字符串".to_string();
// 创建 CString (可能失败)
let c_string = CString::new(rust_string)
.expect("Failed to create CString");
// 泄漏所有权,转为原始指针
c_string.into_raw()
}
// ⚠️ 必须提供对应的内存释放函数!
#[no_mangle]
pub extern "C" fn free_c_string(ptr:

最低0.47元/天 解锁文章
2068

被折叠的 条评论
为什么被折叠?



