मैं तीसरे पक्ष के कोड में एक त्रुटि को ट्रैक कर रहा हूं और मैंने इसे कुछ लाइनों के साथ संकुचित कर दिया है।
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
)।