私はサードパーティのコードのエラーを追跡しており、それを何かに沿って絞り込みました。
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
)への二重参照が作成されます。