Saya melacak kesalahan dalam kode pihak ketiga dan saya mempersempitnya menjadi sesuatu di sepanjang baris.
use libc::c_void;
pub unsafe fn foo() {}
fn main() {
let ptr = &foo as *const _ as *const c_void;
println!("{:x}", ptr as usize);
}
Berjalan di stabil 1.38.0 ini mencetak penunjuk fungsi, tetapi beta (1.39.0-beta.6) dan kembali setiap malam '1'. ( Taman bermain )
Apa yang _
disimpulkan dan mengapa perilaku berubah?
Saya berasumsi cara yang tepat untuk melakukan ini foo as *const c_void
, tapi ini bukan kode saya.
let ptr = foo as *const fn() as *const c_void;
foo
sudah menjadi penunjuk fungsi, jadi Anda tidak perlu mengambil alamatnya. Itu menciptakan referensi ganda, tampaknya untuk tipe berukuran nol (dengan demikian nilai ajaib1
).