arrays - 是否有一种正确的方法可以在引用一维中转换二维数组

标签 arrays rust unsafe

我尝试将 2D 数组转换为 rust 中的引用,就像 c/c++ 中的连续 2D 数组一样,但我发现这样做的唯一方法有点过于成功......这就是我的做法:

let mut a=[[0u8;10];10];
let a_ref= unsafe {
    slice::from_raw_parts_mut(a.as_mut_ptr().addr()as *mut u8,100)
};
a_ref.iter().for_each(|i|print!("{i} "))

c 中的等价物可能是:

int main() {
    int a[3][3]={
            {1,2,3},
            {4,5,6},
            {7,8,9},
    };
    int *pA=a[0];
    for (int i = 0; i < 9; ++i)
        printf("%d ",pA[i]);
}

有没有正确的方法在 Rust 中做到这一点?

最佳答案

为了转换原始指针,我们使用 cast()而不是 addr() as _,但除此之外,您的代码很好:

let mut a = [[0u8; 10]; 10];
let a_ref = unsafe { slice::from_raw_parts_mut(a.as_mut_ptr().cast::<u8>(), 100) };
a_ref.iter().for_each(|i| print!("{i} "));

您可以通过直接转换指针来完成更简单的操作,无需构造切片:

let a_ref = unsafe { &mut *(&mut a as *mut [[u8; 10]; 10] as *mut [u8; 100]) };

在 nightly Rust 上,您还可以使用 flatten_mut() ,但这给你的是一个切片而不是一个数组:

#![feature(slice_flatten)]

let a = [[0u8; 10]; 10];
let a_ref: &[u8] = a.flatten_mut();
a_ref.iter().for_each(|i| print!("{i} "));

对于压平切片,有多个 crate ,正如我所说,它也被引入到标准库中;扁平化数组没有实现,原因很简单,没有 generic_const_exprs 就不可能通用地实现。

关于arrays - 是否有一种正确的方法可以在引用一维中转换二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75451936/

相关文章:

c - 在 cgo、golang 中使用 free 时获得双重释放或损坏(out)

rust - 变量所有权在迭代之间如何工作?

c# - 关键字 "unsafe"- 在方法或代码块之前?

rust - 为什么不安全的代码可以编译,但推送到向量的类似代码会提示引用的生命周期不够长?

c - C 中的数组内存分配取决于命名约定?

rust - 使用 Option<T> 中的 T 作为 Rust 中的函数参数

rust - 为什么只有main.rs可以声明mod?

java - 递归 - 添加数组的子集

java - 无法创建内部类数组

javascript - 根据另一个对象的 id 列出数组中的产品