pub trait Interface {
fn print_info(&mut self);
}
struct Holder<'a>(&'a mut (Interface + 'a));
#[derive(Debug)]
struct User {
name: String,
age: u32,
}
impl Interface for User {
fn print_info(&mut self) {
println!("{:#?}", self);
self.age += 1;
}
}
//供外部传入实现
pub fn set_interface(i: &mut Interface) {
let h = Holder(i);
unsafe {
GLOBAL_INTERFACE = std::mem::transmute(&h);
}
}
//全局trait
static mut GLOBAL_INTERFACE: *mut Holder<'static> = 0 as *mut _;
fn main() {
let mut u1 = User {
name: "stack overflow 666".to_string(),
age: 18,
};
set_interface(&mut u1);
unsafe {
(*GLOBAL_INTERFACE).0.print_info(); //第一次没问题
println!("-------------");
(*GLOBAL_INTERFACE).0.print_info(); //第二次直接退出exit code: 0xc0000005, STATUS_ACCESS_VIOLATION
}
}
1
共 6 条评论, 1 页
评论区
写评论这个完美,思路清晰,满足要求,灵活,大佬666。刚学rust生命周期、指针之类的,感觉悟了又会被编译器吊打。感谢!
👇
93996817:
被逆天改命了
👇
liyiheng: 有个疑问, h 不是在 set_interface 里面 drop 么? 为什么第一次打印的时候没出错呢
有个疑问, h 不是在 set_interface 里面 drop 么? 为什么第一次打印的时候没出错呢
3Q!大佬我还想问问,主要逻辑要写在被c语言多次调用的回调函数里,类似事件触发,这种情况下我首先想到的就是如题的全局变量,为了灵活一点,用全局trait变量,有没有方法实现?或者不用全局变量的话,有其他思路,让回调函数多次被调用时,访问的是同一个值? fn call_back(){//一个c的回调函数 会被多次调用 函数已被限定死 无法调整参数 //主要逻辑在里面 //多次调用中 如何访问到同一个函数外的数据
}
-- Q 👇
whfuyn: h是本地变量,函数结束就没了,全局变量拿着个野指针。
h是本地变量,函数结束就没了,全局变量拿着个野指针。