文章目录
- 不安全操作
- 裸指针
- 应用
- 不安全函数or方法
- `extern`调用外部函数
- 调用C语言函数
- 创建供C调用的接口
- 全局变量(静态变量)
- 不安全的trait
- 访问联合体中的字段
不安全操作
裸指针
需要程序员保证有效性
从引用创建
let mut num = 5;
let r1 = &num as *const i32;
let r2 = &mut num as *mut i32;
应用
调用C接口
不安全函数or方法
调用也需要在unsafe{}
代码块之中,
但是这个不安全调用只需要包装一层unsafe{}
即可
fn main() {unsafe fn dangerous() {}unsafe {dangerous();}
}
extern
调用外部函数
extern
中声明函数默认是不安全的
调用C语言函数
extern "C" {fn abs(input: i32) -> i32;
}fn main() {unsafe {println!("Absolute value of -3 according to C: {}", abs(-3));}
}
创建供C调用的接口
#[no_mangle]
告诉编译器不需要修改函数名称。这里extern
的是安全的。
#[no_mangle]
pub extern "C" fn call_from_c() {println!("Just called a Rust function from C!");
}
全局变量(静态变量)
rust中的全局变量使用static
标识,有着固定内存地址,可以是mut
的,通常使用SCREAMING_SNAKE_CASE命名规则。读写mut
的可变静态变量是不安全操作,需要放在unsafe{}
内部。
static mut COUNTER: u32 = 0;fn add_to_count(inc: u32) {unsafe {COUNTER += inc;}
}fn main() {add_to_count(3);unsafe {println!("COUNTER: {COUNTER}");}
}
不安全的trait
unsafe trait Foo {
// methods go here
}
unsafe impl Foo for i32 {
// method implementations go here
}
fn main() {}