我试着在c/c++中将2D数组转换为REF,就像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]) };

在NightRust上,您也可以使用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,就不可能实现通用的.

Rust相关问答推荐

Rust kill std::processs::child

如何使用Match比较 struct 中的值

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

不能在一个代码分支中具有不变的自身borrow ,而在另一个代码分支中具有可变的self borrow

无符号整数的Rust带符号差

用于判断整数块是否连续的SIMD算法.

零拷贝按步骤引用一段字节

在Rust中声明和定义一个 struct 体有什么区别

需要哪些编译器优化来优化此递归调用?

如何正确使用git2::Remote::push?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

如何在 Rust 中将函数项变成函数指针

Rust中是否可以在不复制的情况下从另一个不可变向量创建不可变向量?

使用 Rust 从 Raspberry Pi Pico 上的 SPI 读取值

`map` 调用在这里有什么用吗?

为什么 match 语句对引用类型比函数参数更挑剔?

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

带有库+多个二进制文件的Cargo 项目,二进制文件由多个文件组成?

传递 Option<&mut T> 时何时需要 mut

当值是新类型包装器时,对键的奇怪 HashMap 生命周期要求