Rust:开发 DLL 动态链接库时如何处理 C 字符串

在 Rust 开发 DLL 时,正确处理 *mut c_char*const c_charString 的转换非常重要。以下是几种常见场景的安全转换方法:


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: 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许野平

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值