当前位置: 首页 > 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.jsqmd.com/news/53658/

相关文章:

  • 2025年比较好的3C数码产品亚克力展示架厂家推荐及采购参考
  • 2025锂电PACK连接器哪家好?新能源连接器厂家全解析
  • 2025年11月注浆厂家推荐对比:注浆厂家详细评测与选择建议
  • 2025年耐用的钢板预处理线厂家推荐及采购参考
  • 2025年深圳协议离婚律师推荐排行榜,哪个好?哪个靠谱?选哪个?
  • 2025极早期火灾探测厂家推荐+火灾报警厂家推荐清单
  • 2025年北京继承纠纷律师推荐排行榜,哪个好?哪个靠谱?选哪个?
  • 2025新加坡留学机构哪个好
  • 2025英国留学中介公司有哪些
  • 2025英国留学哪家中介靠谱
  • AI元人文:价值原语化——构建人机共识的文明语法
  • AI产业爆发期,如何用 “产教融合” 破解人才缺口困局?
  • 2025年口碑好的红木家具厂家最新实力排行
  • 2025年优质的F30喷涂四氟/不沾涂层喷涂四氟TOP实力厂家推荐榜
  • 低空经济数据要素市场化配置的路径探索
  • 2025年专业的改性沥青设备热门厂家推荐榜单
  • 2025年广州到白俄罗斯物流公司权威推荐榜单:广州到白俄罗斯货运‌/广州到白俄罗斯双清门到门‌/广州到白俄罗斯空运源头公司精选
  • 2025年1.0mm隧道防水土工布土工膜/土工布土工膜厂家推荐及选购指南
  • 2025 年 11 月盐城保洁服务公司推荐:盐城家庭保洁、开荒、专项、企业、商铺、家电清洗、新居、地毯清洗、地板打蜡、玻璃幕墙清洁服务公司选择指南
  • 2025广州英国留学中介机构有哪些
  • 软瓷厂家哪家好?2025热门软瓷厂家推荐,从品质到服务都靠谱
  • 免费试听不踩坑!初中物理培训哪些机构有试听课,帮你筛选好机构
  • 【JPCS出版 | EI检索】第四届航空航天与控制工程国际学术会议 (ICoACE 2025)
  • 2025适配器工厂怎么选择清单:附插墙式适配器工厂口碑指南
  • 科研 / 工程必备:Origin 2025b 统计质量图表 + 电化学分析实战下载安装步骤
  • 快速开发小程序公司,3家高效快速开发小程序公司实力剖析:微信小程序/抖音小程序/支付宝小程序/工单小程序/社区小程序全涵盖开发公司推荐
  • 2025年高中培训机构权威评估指南,小班制高中培训机构推荐
  • 2025年诚信的分机盘管回风箱/卧式明装风机盘管厂家最新权威实力榜
  • Vue Class 与 Style 绑定
  • 【译】Visual Studio 十月更新 —— 新模型、记忆功能、计划功能及更多内容