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

Rust中如何安全且惯用实现间接移动切片索引操作

完全可以在安全Rust中实现等价功能,且完全符合语言惯用范式,不需要借助任何unsafe代码。

你C示例里的二级指针int**,核心作用是让被调用函数可以修改调用方作用域内一级指针的值。在Rust中,借用切片&[T]/&mut [T]本身就承担了C中指向数组区段的指针的作用,只要传递对这个切片的可变引用&mut &[T],就完全等价于C中的二级指针,能实现完全一致的效果。

和你给出的C代码逻辑完全对等的Rust实现如下:

fn inc(pointer: &mut &[i32]) {
    // 将调用方持有的切片向前移动1个元素,等价于C中*pointer = *pointer + 1
    *pointer = &pointer[1..];
}

fn main() {
    let myarray = [1, 2, 3];
    let mut mypointer: &[i32] = &myarray;
    
    inc(&mut mypointer);
    
    println!("{}", mypointer[0]); // 输出2
}

逻辑说明

  • 上述代码中inc函数接收的&mut &[i32]参数,就是指向main函数中mypointer切片变量的可变引用,和C中传入&mypointer(二级指针)的行为完全一致。
  • 函数内通过解引用外层可变引用,直接修改调用方持有的切片值,让它指向原数组从索引1开始的区段,运行结果和C示例完全一致。
  • 这种写法是Rust处理这类场景的标准方式,完全受借用检查器保护:
    • 所有切片截断操作都会自动做边界检查,如果你尝试把切片移动到超出原数组长度的位置,会直接触发编译错误或运行时panic,不会出现C中指针越界导致的未定义行为。
    • 编译器会自动校验所有引用的生命周期,修改后的切片永远不会指向已经被释放的内存,不会产生悬垂引用。

如果你还需要在被调用函数中修改数组元素的值,只需要使用可变切片&mut [T],对应参数类型调整为&mut &mut [T]即可,示例如下:

fn inc_and_modify(pointer: &mut &mut [i32]) {
    // 修改当前切片起始位置的元素值
    pointer[0] = 100;
    // 将切片向前移动1个元素
    *pointer = &mut pointer[1..];
}

fn main() {
    let mut myarray = [1, 2, 3];
    let mut mypointer: &mut [i32] = &mut myarray;
    
    inc_and_modify(&mut mypointer);
    
    println!("{}", mypointer[0]); // 输出2,原数组第一个元素已被修改为100
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:36:35