pointers - 如何创建可以以线程安全方式传递给 FFI 函数的未初始化指针?

标签 pointers rust ffi

我有一些 Rust 代码,将指针传递给 FFI 函数,如下所示:

let mut mu = MaybeUninit::uninit();
let mut p = mu.as_mut_ptr();

let r = unsafe {
    ffi_fn(&mut p)
};

这对于一个线程来说工作得很好,但是对于许多线程,我认为 MaybeUninit::uninit() 会同时向两个线程提供相同的指针,这会导致问题。

最佳答案

正如 Optimistic Peach 和 trentcl 在评论中指出的那样,正确的方法是检索空指针 ( playground example ):

let ptr: *mut i8 = std::ptr::null_mut();
let ptr_to_ptr: *const *mut i8 = &ptr;

与 C 的行为相同:即使指针本身为 NULL,指向该指针的指针也是内存中的有效地址。然后,由 FFI 边界的另一侧将此地址更改为 0x0 以外的地址,您将获得该更改(因为您也可以直接引用它)。

关于pointers - 如何创建可以以线程安全方式传递给 FFI 函数的未初始化指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58158069/

相关文章:

rust - 通过 FFI 从 const 数组获取 `*const c_char` 的最佳方法是什么?

c++ - 在没有智能指针的情况下返回指向堆对象的指针

c++ - 将指针对象传递给方法

c - 如何通过指针运算访问内存块的头?

rust - 当特征和结构使用相同的方法名时如何调用方法?

c++ - 将 C++ 异常映射到结果

c - 连续内存块的动态分配(malloc)

rust - Rust中的中断是否可以使用全局可变数据?

mocha.js - PureScript FFI 转 mocha

winapi - Rust 编译期间的链接错误(Cargo)