一些libc函数,例如,sigemptyset(set: *mut sigset_t)
获取指向变量的指针,将其视为未初始化并初始化它.
我最终得到这个代码:
let mut newmask = std::mem::uninitialized(); libc::sigemptyset(&mut newmask);
这没关系,但是当我有很多这些变量时,我最终会得到这样的结果:
let mut newmask = std::mem::uninitialized(); let mut oldmask = std::mem::uninitialized(); let mut pendmask = std::mem::uninitialized();
我可以压缩它:
use std::mem::unitialized as uninit; let (mut newmask, mut oldmask, mut pendmask) = (uninit(), uninit(), uninit());
有没有更好的方法来编写这段代码?出于教育目的,我明确地想要使用libc.
幸运的是,元组也是正常类型.那怎么样:
let (mut newmask, mut oldmask, mut pendmask) = std::mem::uninitialized();
但是,它不会比这更好.最好的办法是将所有变量组合成一个更大的类型(如元组或结构)并取消初始化.
但是,不安全的事情写得很冗长,很烦人.未初始化的变量确实非常危险,特别是在处理Drop
类型时.我相信你已经知道了,但我仍然想确保每个人都阅读文档uninitialized()
以了解所有可能的陷阱.