【问题标题】:Casting a C pointer to a struct, in Rust在 Rust 中将 C 指针转换为结构
【发布时间】:2020-06-24 06:46:27
【问题描述】:

我在 Rust 中为 C 中的一个库提供了绑定,但它们并不完整。

在 C 代码中,我定义了一个简化的宏,如下所示:

  #define MY_MACROS1(PTR) (((my_struct1 *) (PTR))->field1.field2 >> 2)

我需要在 Rust 中实现同样的目标。

我有一个 my_struct1 的 Rust 绑定定义。我有一个指针

  let my_ptr1: usize = unsafe { get_a_pointer_from_c(); }

如何将指针 my_ptr1 转换为 my_struct1 或更确切地说是 my_struct1 *

Rust 绑定到 get_a_pointer_from_c() 返回一个 usize 类型的指针,注意。

【问题讨论】:

  • 为什么不在 C 上做一个函数来返回看起来像 int 的值?
  • 是什么让您无法按照所示的方式进行操作?
  • 我认为 ` \ ` 是错字或复制粘贴错误,或者是与换行空白有关的意外。

标签: c pointers rust ffi


【解决方案1】:
  • 选项 1 是 Ôrel 建议的:让 C 端将正确的访问器公开为函数,并从 Rust 调用它。

  • 选项 2 是在 Rust 端定义 C 结构并将指针转换为指向 Rust 端的指针/引用,例如

    let mut p;
    let r = unsafe {
        p = ptr::NonNull::new(
            get_pointer_from_c() as *mut YourType
        ).unwrap();
        p.as_mut()
    };
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    • 2011-09-15
    • 2015-01-26
    相关资源
    最近更新 更多