一些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。
答案 0 :(得分:5)
幸运的是,元组也是正常类型。那怎么样:
code = 0;
try
your_script
catch ME
fprintf(2, 'CAUGHT EXCEPTION:\n');
fprintf(2, '%s(%d): %s\n', ME.stack.file, ME.stack.line, ME.message);
code = 1;
end
exit(code)
然而,它不会比这更好。最好的办法是将所有变量组合成一个更大的类型(如元组或结构)并取消初始化。
但是,不安全的事情写得很冗长,很烦人。未初始化的变量确实非常危险,尤其是在处理void main (void)
{
char s[] = "Programming is hard";
printf("%s", &s);
printf("%s", s);
return 0;
}
类型时。我相信你已经知道,但我仍然想确保所有人都阅读the documentation of uninitialized()
以了解所有可能的陷阱。