【问题标题】:Rust Version of C codeC 代码的 Rust 版本
【发布时间】:2014-10-30 23:55:24
【问题描述】:

很简单,我怎样才能在 Rust 中做与 C 中相同的事情。

所以C代码:

extern mps_res_t mps_arena_create_k(mps_arena_t *);

mps_arena_t arena;
res = mps_arena_create_k(&arena);

在 C 中这是可行的,所以在 rust 中我做到了:

extern "C" {
    pub fn mps_arena_create_k(arg1: *mut mps_arena_t) -> mps_res_t;
} // created by rust_bindgen

unsafe {
   let mut arena : *mut mps_arena_t; 
   res = mps_arena_create_k(arena);
}

问题是编译器报错:

error: use of possibly uninitialized variable: `arena`

我不是一个优秀的 C 程序员,但这种模式很常见,我如何在 rust 中做到这一点?

【问题讨论】:

  • stackoverflow.com/questions/26185618/… 顺便说一句,Rust 还没有被标准化,我不知道现在将 Rust 用于这种“敏感”的东西是否有意义,或者它是否有意义;如果我是你,我会等待标准的 Rust 1.0。
  • 请用英语而不是 C 的部分 sn-ps 来询问您的 rust-question。

标签: rust


【解决方案1】:

使用std::mem::uninitialized 让变量暂时未初始化:

let mut arena: mps_arena_t;
let res;
unsafe {
    arena = std::mem::uninitialized();
    res = mps_arena_create_k(&mut arena);
}

注意arena 应该输入为mps_arena_t 而不是*mut mps_arena_t(可能是音译错误?)。您还需要将arena 保留在unsafe 块之外(因此将let 和分配分开),除非您打算很快将其销毁。

【讨论】:

  • 谢谢,我很生气 *mut mps_arena_t 因为否则我无法让它抛出类型检查器。但是您的版本也可以。谢谢。
【解决方案2】:

C 语句mps_arena_t arena; 是一个局部变量的声明,如果我没记错的话,堆栈上有适当的内存,未定义。 (它可能被归零或未初始化。)

在 Rust 中,等效语句是 let mut arena: mps_arena_t = unsafe { std::mem::uninitialized() };。然后你会调用mps_arena_create_k(&mut arena)&mut T 强制转换为*mut T 隐式)。

【讨论】:

  • Deklaring 这样的事情不是问题。但在第一次使用之前,编译器必须确保它已经初始化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2012-05-14
  • 2019-03-01
相关资源
最近更新 更多