Je recherche une erreur dans le code tiers et je l'ai réduite à quelque chose dans le sens de.
use libc::c_void;
pub unsafe fn foo() {}
fn main() {
let ptr = &foo as *const _ as *const c_void;
println!("{:x}", ptr as usize);
}
Fonctionné sur la version 1.38.0 stable, cela affiche le pointeur de la fonction, mais la version bêta (1.39.0-beta.6) et la nuit renvoient «1». ( Aire de jeux )
À quoi est-il _
déduit et pourquoi le comportement a-t-il changé?
Je suppose que la bonne façon de lancer ce serait simplement foo as *const c_void
, mais ce n'est pas mon code.
let ptr = foo as *const fn() as *const c_void;
foo
est déjà un pointeur de fonction, vous ne devez donc pas lui attribuer d'adresse. Cela crée une double référence, apparemment à un type de taille nulle (donc la valeur magique1
).