当前位置: 首页 > news >正文

rust字符串数据类型String、str、CString和CStr

在 Rust 中,处理字符串时有四种主要的类型:StringstrCString 和 CStr。理解它们之间的区别至关重要,特别是当需要与 C 语言代码进行交互时。
 
核心区别概览
 
类型是否拥有所有权是否可变用途适用场景
String Rust 原生,堆分配,动态大小 Rust 内部使用,可增长的字符串
str Rust 原生,不可变,编译时已知大小 字符串字面量、切片引用
CString C 兼容,堆分配,以 \0 结尾 需要传递拥有所有权的字符串给 C 函数时
CStr C 兼容,不可变,引用,以 \0 结尾 需要从 C 函数接收字符串引用或处理 C 风格字符串常量时
 

 
1. String 和 str (Rust 原生字符串)
这两个是用于日常 Rust 编程的标准字符串类型。
 
String
  • 特点: 拥有所有权,存储在堆上,可增长,UTF-8 编码。
  • 使用场景:
    • 构建在运行时需要修改或增长的字符串(例如用户输入、文件读取)。
    • 需要在函数间传递所有权时。
 
str (字符串切片,通常写作 &str)
  • 特点: 不拥有所有权,是对 String 或静态存储区的不可变引用,UTF-8 编码。
  • 使用场景:
    • 函数参数:高效地传递字符串数据而不转移所有权或复制数据。
    • 字符串字面量:let s = "hello"; 中 "hello" 的类型就是 &'static str
    • 从 String 中获取子串。
 
2. CString 和 CStr (C 语言兼容字符串)
这两个类型专门用于 Rust 和 C 语言代码(Foreign Function Interface, FFI)之间的互操作。C 语言要求字符串必须以空字符(null terminator, \0)结尾。
 
CString
  • 特点: 拥有所有权,存储在堆上,以 \0 结尾,内部不能包含 \0
  • 使用场景:
    • 最重要场景: 将一个 Rust 字符串传递给一个期望拥有所有权的 C 函数(例如调用 C 库的 API)。
    • 它提供安全保障,确保字符串符合 C 语言的要求,并且不包含意外的空字符。
 
rust
use std::ffi::CString;let c_string = CString::new("Hello C!").expect("CString::new failed");
// 现在可以将 c_string 传递给外部的 C 函数
unsafe {// some_c_function(c_string.as_ptr());
}
// 当 c_string 离开作用域时,内存安全释放
CStr
  • 特点: 不拥有所有权,是对内存中以 \0 结尾的 C 风格字符串的不可变引用,内部不能包含 \0
  • 使用场景:
    • 最重要场景: 从 C 函数接收一个字符串指针(例如从 C 库读取配置字符串)。
    • 表示一个静态的 C 语言字符串常量。
use std::ffi::CStr;
use std::os::raw::c_char;// 假设我们从 C 代码中获得一个指针
let c_ptr: *const c_char = /* get from C */;// 使用 unsafe 块将其转换为安全的 CStr 引用
let c_str_ref = unsafe { CStr::from_ptr(c_ptr) };// 可以将其转换为 Rust 原生的 &str 使用
let rust_str: &str = c_str_ref.to_str().expect("Contains invalid UTF-8");
println!("来自 C 的字符串:{}", rust_str);
总结要点
  1. 日常 Rust 编程: 只用 String 和 &str
  2. 与 C 语言 FFI 交互: 必须使用 CString(传递所有权到 C)和 CStr(从 C 获取引用)。
  3. 安全性: CString 和 CStr 保证了 C 语言要求的空字符结尾格式,并且它们的方法通常在 unsafe 块内使用,需要开发者确保指针的有效性。

 

http://www.gsyq.cn/news/63682.html

相关文章:

  • 2025年比较好的3C数码产品亚克力展示架厂家推荐及采购参考
  • 2025锂电PACK连接器哪家好?新能源连接器厂家全解析
  • 2025年北京继承纠纷律师推荐排行榜,哪个好?哪个靠谱?选哪个?
  • 2025极早期火灾探测厂家推荐+火灾报警厂家推荐清单
  • 2025新加坡留学机构哪个好
  • AI元人文:价值原语化——构建人机共识的文明语法
  • 2025年专业的改性沥青设备热门厂家推荐榜单
  • 2025年广州到白俄罗斯物流公司权威推荐榜单:广州到白俄罗斯货运‌/广州到白俄罗斯双清门到门‌/广州到白俄罗斯空运源头公司精选
  • 科研 / 工程必备:Origin 2025b 统计质量图表 + 电化学分析实战下载安装步骤
  • 免费试听不踩坑!初中物理培训哪些机构有试听课,帮你筛选好机构
  • 【JPCS出版 | EI检索】第四届航空航天与控制工程国际学术会议 (ICoACE 2025)
  • 2025年初中物理培训机构深度推荐:专业师资+教学案例,学习更靠谱!
  • 基于ESP32-C3驱动BL0942电参数采集模块Arduino代码
  • 2025年本地人推荐的火锅品牌口碑排行榜TOP10,特色美食/美食/火锅/火锅店/重庆火锅/老火锅/川渝火锅火锅品牌排行
  • Mutual妙趣艺增长飞轮是什么?解码文娱IP资产化的三位一体创新引擎
  • 2025年苏州婚礼策划机构权威推荐榜单:目的婚礼‌/草坪婚礼‌/西式婚礼源头机构精选
  • 2025年优质的淋浴房配件厂家最新热销排行
  • 重点高中退休教师授课培训机构,2025年高中培训机构权威评估指南
  • 世界时间仪表盘:一站式全球时间管理解决方案
  • TabControl的bug
  • 信创背景下, DevOps体系中制品库的全生命周期安全管控
  • 植物养发加盟品牌如何选择:一份全面指南助你成功创业
  • 2025专业胶装说明书印刷生产厂家:异型\圆角说明书厂家推荐
  • 水产养殖溶氧增氧设备哪家好?2025水产养殖设备厂家口碑榜
  • 2025年11月情人节送女友礼物推荐:高性价比解决方案及市场趋势
  • 2025年11月情人节送女友礼物推荐:知名品牌榜单与选购指南
  • 2025年仓储货架品牌前十强推荐榜单
  • 费曼技巧
  • Vue响应式数据更新问题解决方案
  • 题解:P5226([SCOI2015] 小凸解密码)