我有一些Rust代码可以将指针传递给FFI函数,如下所示:
let mut mu = MaybeUninit::uninit();
let mut p = mu.as_mut_ptr();
let r = unsafe {
ffi_fn(&mut p)
};
这在一个线程上工作正常,但在许多线程上,我认为MaybeUninit::uninit()
将同时为两个线程提供相同的指针,这会导致问题。
正如乐观的桃子和trentcl在评论中指出的那样,正确的方法是检索空指针(playground example:]]
let ptr: *mut i8 = std::ptr::null_mut(); let ptr_to_ptr: *const *mut i8 = &ptr;
与C的行为相同:即使指针本身是
NULL
,指向它的指针也是内存中的有效地址。然后,将这个地址更改为0x0
以外的其他内容,将由FFI边界的另一端决定,您将获得该更改(因为您也直接引用了该地址)。