আমি তৃতীয় পক্ষের কোডে একটি ত্রুটি সন্ধান করছি এবং আমি এটিকে কিছু লাইনের সাথে সংকুচিত করেছি।
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
)।