我尝试将 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/