You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust中如何将*mut i8指针转换为String并正常打印内容

解决方法

你直接打印*mut raw::c_char类型变量时,Debug格式化默认输出的是指针本身的内存地址,要输出指向的字符串内容,需要先把C风格指针转换为Rust的字符串类型。

转换操作属于不安全操作,你需要自行保证以下前提:

  • 指针不为空
  • 指针指向的是合法的、以\0结尾的C字符串
  • 转换操作执行期间,指针指向的内存没有被释放,不会出现悬垂指针

修改后的代码示例

use std::ffi::CStr;
use std::os::raw;

// 原有字符串转C指针的逻辑保留
let string: &str = "localhost";
let bytes: Vec<u8> = String::from(string).into_bytes();
let mut c_chars: Vec<i8> = bytes.iter().map(|c| *c as i8).collect::<Vec<i8>>();
c_chars.push(0);
let ip: *mut raw::c_char = c_chars.as_mut_ptr();

// 新增转换打印逻辑
unsafe {
    let c_str = CStr::from_ptr(ip);
    // 确认C字符串是合法UTF-8可以直接用unwrap,否则建议做错误处理
    let rust_str = c_str.to_str().expect("C字符串包含无效UTF-8字符");
    println!("Connecting to: {}", rust_str);
}

补充说明

  • 如果你的C字符串可能包含非UTF-8字符,可以用c_str.to_string_lossy()替代to_str(),遇到无效字符时会自动替换为�,不会直接触发panic。
  • 务必保证转换期间存储字符串的c_chars变量没有被销毁,否则指针会变成悬垂指针,触发未定义行为。

内容的提问来源于stack exchange,提问作者Ivan Raul Sanchez Diaz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:15:00