如何将&&T转换为*const *const T?为何出现编译错误?
Rust中&&i32转*const *const i32编译错误的原因
先看你给出的代码:
let val = &&10; let ptr_ptr = val as *const *const i32; // 编译错误
类型转换规则限制
Rust的类型强制转换不允许直接从双重引用&&i32一步转成双重原始指针*const *const i32。这类跨层级的转换需要分步完成:先把外层的&(&i32)转成*const &i32,再将其转成*const *const i32。
正确的写法示例:
let val = &&10; // 分步转换 let ptr_ptr = val as *const &i32 as *const *const i32;
或者拆分得更清晰:
let val = &&10; let outer_ptr: *const &i32 = val as *const &i32; let ptr_ptr: *const *const i32 = outer_ptr as *const *const i32;
Rust要求这类转换必须显式分步,因为直接跨层级的转换可能隐含未定义行为风险,语言设计上强制开发者明确转换步骤。
关于&&10内存布局的误解
你对&&10的内存布局理解有误:
10作为i32字面常量,会被存储在静态存储区(而非栈上),因为它是编译期确定的固定值。- 栈上仅存放两个指针:第一个指针(类型
&i32)指向静态区的10,第二个指针(类型&&i32)指向这个&i32指针。 - x64架构下,每个指针占8字节,所以栈上总共占用16字节,静态区占用4字节的
i32值,不存在栈上有三个部分的情况。
内容的提问来源于stack exchange,提问作者user3070377
相关产品推荐
相关产品推荐

