给定一段不安全的代码(绑定(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/