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
相关产品推荐
相关产品推荐

