vector - 在传递给不安全代码之前正确初始化向量

标签 vector rust unsafe

给定一段不安全的代码(绑定(bind)到系统库),其类型为:

pub fn unsafe_system_call(buf: *mut ::std::os::raw::c_short) {}

我用一个函数包装它:

pub fn wrapper(buf: &mut [u8]) {
    unsafe {
        ffi::unsafe_system_call(buf.as_ptr() as *mut _);
    }
}

可以使用静态数组缓冲区调用wrapper():

let mut buf: [u8; 7] = [0, 0, 0, 0, 0, 0, 0];
wrapper(&mut buf);

但是当缓冲区的大小应该是动态的,并尝试使用Vec时,不清楚如何初始化缓冲区:

let mut buf = Vec::with_capacity(runtime_size);
wrapper(&mut buf);

此代码仅创建一个 Vec,但不会初始化内存以准备不安全的调用,并且库调用无法正确执行。

正确的做法是什么?

最佳答案

您可以使用 vec! 宏简单地创建一个零初始化向量:

let mut buf = vec![0u8; runtime_size];

您还可以映射固定范围(如果您需要基于索引i进行初始化)并将其收集为更通用的方法:

let mut buf: Vec<u8> = (0..runtime_size).map(|_i| 0u8).collect();

关于vector - 在传递给不安全代码之前正确初始化向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73089485/

相关文章:

C++11 initializer_list 构造函数,带有自定义 vector 类的头文件和 cpp 文件

c++ - 如何在虚类方法中使用 std::vector::remove()?

rust - 如何为结构的可变引用中的字段换入新值?

c - C 中的动态数组 vector

c++ - 如果 std::vector::resize 的大小参数等于当前大小怎么办?

function - 如何在泛型函数中构造具体类型?

vector - 如何仅交换向量中结构的某些成员?

haskell - unsafeDupablePerformIO 和 accursedUnutterablePerformIO 有什么区别?

java - 从未通过 allocateInstance(Java) 从对象调用 Finalize

parallel-processing - 并行处理 vec : how to do safely, 还是不使用不稳定的功能?