求与演示运行时栈功能的C代码等价的Rust实现方法
在Rust中模拟C语言栈地址复用的最简实现方式
你提到的C代码通过返回栈变量地址展示了栈帧复用的特性——fun返回的局部变量a的地址,在fun2调用时被局部变量b复用,所以最终两次解引用都得到20。
由于Rust的安全机制会严格禁止返回悬垂引用(栈帧销毁后引用失效),直接用借用会触发编译器错误。要实现同样的测试,必须通过unsafe块配合裸指针绕过安全检查,最简实现如下:
fn fun() -> *mut i32 { let mut a = 10; &mut a as *mut i32 } fn fun2() -> *mut i32 { let mut b = 20; &mut b as *mut i32 } fn main() { let a_ptr = fun(); let b_ptr = fun2(); unsafe { println!("a: {} b: {}", *a_ptr, *b_ptr); } }
说明:
- 用
*mut i32(裸可变指针)替代Rust的安全引用,编译器不会对裸指针做生命周期检查; fun和fun2中将栈变量的引用强制转换为裸指针返回;- 解引用裸指针必须在
unsafe块中进行,这是Rust明确标记不安全操作的方式; - 运行这段代码会得到和C代码一致的结果
a:20 b:20,验证栈地址复用特性。
注意:这种写法完全违背了Rust的内存安全设计,仅用于测试栈复用的原理,实际开发中绝对不要使用,否则会引发不可预测的内存错误。
内容的提问来源于stack exchange,提问作者oneneozero
相关产品推荐
相关产品推荐

