pointers - 我如何在 Rust 中编写这个 C 函数?

标签 pointers rust

我如何用 Rust 编写下面的函数?有没有一种方法可以安全地编写 replace() 或者该操作本身就不安全? list 不必是数组,向量也可以。这是我感兴趣的替换操作。

void replace(int *list[], int a, int b) {
    *list[a] = *list[b];
}

我想要以下行为:

int a = 1;
int b = 2;
int *list[] = { &a, &a, &b, &b };

*list[0] = 3;        // list has pointers to values: [3, 3, 2, 2]
replace(list, 2, 0); // list has pointers to values: [3, 3, 3, 3]
*list[0] = 4;        // list has pointers to values: [4, 4, 4, 4]

最佳答案

修改问题的答案

使用rust does not allow您对同一项目有多个可变引用(别名)。这意味着您永远无法运行相当于第三行的代码:

fn main() {
    let mut a = 1;
    let vals = &[&mut a, &mut a];
}

这失败了:

cannot borrow `a` as mutable more than once at a time

What about using Rc and RefCell?

Rc不允许我们改变值:

A reference-counted pointer type over an immutable value.

(强调我的)

RefCell::borrow_mut不允许多个并发借用:

Panics if the value is currently borrowed.

原始问题的答案

基本上是一样的。我选择了 u8 因为它更容易打字。 :-)

fn replace(v: &mut [&mut u8], a: usize, b: usize) {
    *v[a] = *v[b]
}

fn main() {
    let mut vals = vec![1,2,3,4];
    {
        let mut val_refs: Vec<&mut u8> = vals.iter_mut().collect();
        replace(&mut val_refs, 0, 3);
    }
    println!("{:?}", vals);
}

( playpen link )

Rust 确实会进行边界检查,因此如果您使用大于切片的索引进行调用,程序将崩溃并且您不会出现内存损坏。

关于pointers - 我如何在 Rust 中编写这个 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28786758/

相关文章:

c++ - undefined symbol ,使用指针访问成员函数 C++

iterator - 如何递归传递函数指针?

rust - 自定义窗口管理器: Some GTK+ 3 windows receive focus but will not accept mouse clicks

rust - 我如何让结构的字段成为 `Iterator` 超过 `T` 元素?

rust - 如何在 Rust 中打印没有尾随换行符的输出?

c - 运行C程序时出现段错误

C 传递和指针

c - 列表到列表分配变成垃圾

c - 大尾数法和小尾数法有点困惑

rust - 你如何在 Rust 中实现这个简单的 trie 节点?