You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求与演示运行时栈功能的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);
    }
}

说明:

  1. 用*mut i32(裸可变指针)替代Rust的安全引用,编译器不会对裸指针做生命周期检查;
  2. fun和fun2中将栈变量的引用强制转换为裸指针返回;
  3. 解引用裸指针必须在unsafe块中进行,这是Rust明确标记不安全操作的方式;
  4. 运行这段代码会得到和C代码一致的结果a:20 b:20,验证栈地址复用特性。

注意:这种写法完全违背了Rust的内存安全设计,仅用于测试栈复用的原理,实际开发中绝对不要使用,否则会引发不可预测的内存错误。

内容的提问来源于stack exchange,提问作者oneneozero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 16:40:30