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

在Rust中存储指向结构体字段的原始指针(C数据结构移植问题)

在Rust中存储指向结构体字段的原始指针(C数据结构移植问题)

我明白你现在要把C里这种指向结构体字段的指针逻辑移植到Rust里,尤其是要处理堆分配Node的情况对吧?先给你对应上C代码的Rust实现思路,再唠唠必须注意的安全细节。

先回顾下你的C代码核心逻辑:Tree里的dangling_arrow是个二级指针,专门指向某个Node的next字段,之后能通过解引用来直接修改这个字段的值。

对应Rust的实现代码

首先我们用原始指针来对应C里的指针逻辑,同时用Box来模拟C的堆分配:

#[derive(Debug)]
struct Node {
    next: *mut Node, // 对应C中的`struct Node* next`
}

#[derive(Debug)]
struct Tree {
    start: *mut Node,
    dangling_arrow: *mut *mut Node, // 对应C中的`struct Node** dangling_arrow`,指向Node的next字段
}

然后是初始化和修改的示例,完全对应你C里的main函数逻辑:

fn main() {
    // 堆分配一个Node,用Box::into_raw把智能指针转成裸指针(模拟C的动态分配)
    let node = Box::new(Node { next: std::ptr::null_mut() });
    let node_ptr = Box::into_raw(node);

    // 初始化Tree,重点是给dangling_arrow赋值
    let mut tree = Tree {
        start: node_ptr,
        // 步骤:先解引用node_ptr拿到Node实例,再取next字段的可变地址,最后转成目标裸指针类型
        dangling_arrow: &mut (*node_ptr).next as *mut *mut Node,
    };

    // 模拟后续通过dangling_arrow修改Node的next字段
    let new_node = Box::new(Node { next: std::ptr::null_mut() });
    let new_node_ptr = Box::into_raw(new_node);

    // 操作裸指针必须放在unsafe块里,因为Rust无法帮我们保证安全
    unsafe {
        *tree.dangling_arrow = new_node_ptr;
    }

    // 验证修改结果
    unsafe {
        println!("原Node的next字段值:{:?}", (*node_ptr).next);
        println!("dangling_arrow指向的内容:{:?}", *tree.dangling_arrow);
    }

    // !!重要:手动回收内存,避免泄漏
    // 把裸指针转回Box,让Rust自动调用析构函数释放堆内存
    unsafe {
        let _ = Box::from_raw(new_node_ptr);
        let _ = Box::from_raw(node_ptr);
    }
}

必须注意的几个点

  • unsafe块的必要性:所有操作裸指针的行为(解引用、修改、地址转换)都要放在unsafe里,因为这会绕过Rust的借用检查器——你得自己手动保证:指针指向的内存没有被提前释放,没有同时存在可变和不可变的冲突访问。
  • 内存泄漏问题:用Box::into_raw把Box转成裸指针后,Rust的自动内存管理就失效了,所以最后一定要用Box::from_raw把裸指针转回来,否则堆内存会一直占用着。
  • 安全替代思路:如果不是必须严格复刻C的指针逻辑,尽量用Rust的安全指针方案,比如Rc<RefCell<Node>>或者Arc<Mutex<Node>>来实现共享可变访问,能避免手动处理裸指针的安全风险。

备注:内容来源于stack exchange,提问作者Idrissa B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:24:29