ฉันกำลังติดตามข้อผิดพลาดในรหัสบุคคลที่สามและฉัน จำกัด ให้แคบลงเหลือบางอย่างตามลำดับ
use libc::c_void;
pub unsafe fn foo() {}
fn main() {
let ptr = &foo as *const _ as *const c_void;
println!("{:x}", ptr as usize);
}
วิ่งบนเสถียร 1.38.0 นี้จะพิมพ์ตัวชี้ฟังก์ชั่น แต่เบต้า (1.39.0-beta.6) และส่งคืน '1' ทุกคืน ( สนามเด็กเล่น )
_
การอนุมานคืออะไรและทำไมพฤติกรรมจึงเปลี่ยนไป
ฉันถือว่าวิธีที่ถูกต้องในการส่งแบบนี้จะเป็นไปได้foo as *const c_void
แต่นี่ไม่ใช่รหัสของฉัน
let ptr = foo as *const fn() as *const c_void;
foo
เป็นตัวชี้ฟังก์ชันอยู่แล้วดังนั้นคุณไม่ควรใช้ที่อยู่ ที่สร้างการอ้างอิงสองครั้งดูเหมือนจะเป็นประเภทขนาดศูนย์ (เช่นค่ามายากล1
)