Rust中切片是否必须是指针?str切片编译时大小未知错误如何解决?
Rust切片是否必须为指针?
- Rust中的切片分为两层概念:
- 原生切片类型:如字符串切片
str、数组切片[T],这类属于动态大小类型(DST),长度不固定,编译期无法确定其占用内存大小,因此无法直接在栈上存储、作为参数传递或者作为返回值返回,你不会在代码中直接使用这类类型的值。 - 切片引用:我们日常所说的可操作的切片,都是原生切片的引用类型,如
&str、&mut str、&[T]、&mut [T],这类是胖指针,存储了指向数据起始位置的指针+切片长度,编译期大小固定(64位系统下占16字节),是切片的实际使用形式。
- 原生切片类型:如字符串切片
- 结论:不存在直接使用原生切片类型的场景,所有可操作的切片都是指针(胖指针)形式。
报错原因及修复逻辑
你遇到的报错核心是直接使用了动态大小类型str作为值传递,具体细节如下:
- 首先明确变量类型:
string_literal是字符串字面量,类型为&'static str,本身是一个胖指针,编译期大小确定,指向静态存储区存储的字符串内容。 - 索引操作的返回值:对
&str执行范围索引[..3]时,返回的是原生切片类型str,而非引用,属于编译期大小未知的动态大小类型,Rust不允许将这类类型直接作为函数参数传递,因此触发the size for values of typestrcannot be known at compilation time报错。 - 加
&修复的原因:添加&后得到的是&str类型,也就是字符串切片胖指针,编译期大小固定,符合Rust对参数大小的编译期要求,因此可以正常运行。
你之前的误解点在于:你混淆了
string_literal本身的类型(&str,大小固定)和索引操作返回值的类型(str,大小不固定),string_literal的大小确实编译期可知,但索引后得到的str实例大小是运行时确定的,无法直接在栈上存储。
内容的提问来源于stack exchange,提问作者Enrique Ortiz Casillas
相关产品推荐
相关产品推荐

