面试题答案
一键面试整数类型转换
在Rust中,整数类型有i8
、i16
、i32
、i64
、u8
、u16
、u32
、u64
等,在C语言中对应的有char
、short
、int
、long
、unsigned char
、unsigned short
、unsigned int
、unsigned long
等。它们在内存布局和表示范围上基本是一致的,所以转换较为简单。
假设我们有一个C函数,接受一个int
参数并返回其平方:
// c_code.c
int square(int num) {
return num * num;
}
在Rust中调用这个函数,并进行整数类型转换:
extern "C" {
fn square(num: i32) -> i32;
}
fn main() {
let num: i32 = 5;
let result: i32;
unsafe {
result = square(num);
}
println!("The square of {} is {}", num, result);
}
字符串类型转换
在C语言中,字符串通常以\0
结尾的字符数组表示,即char *
类型。而在Rust中,字符串有&str
和String
两种主要类型。
假设我们有一个C函数,接受一个C字符串并打印它:
// c_code.c
#include <stdio.h>
void print_c_string(const char *str) {
printf("%s\n", str);
}
在Rust中调用这个函数,并进行字符串类型转换:
extern "C" {
fn print_c_string(str: *const i8);
}
fn main() {
let rust_string: &str = "Hello, C from Rust!";
let c_string: *const i8 = rust_string.as_ptr();
unsafe {
print_c_string(c_string);
}
}
如果要从C函数返回字符串给Rust,情况会更复杂一些。例如,C函数分配内存并返回一个字符串指针:
// c_code.c
#include <stdlib.h>
#include <string.h>
char* create_c_string() {
char *str = (char*)malloc(16);
strcpy(str, "Hello from C");
return str;
}
在Rust中调用并处理返回的字符串:
use std::ffi::CStr;
use std::ptr;
use std::mem;
extern "C" {
fn create_c_string() -> *mut i8;
fn free(ptr: *mut libc::c_void);
}
fn main() {
let c_str_ptr: *mut i8;
unsafe {
c_str_ptr = create_c_string();
let c_str = CStr::from_ptr(c_str_ptr);
let rust_str = c_str.to_str().unwrap();
println!("{}", rust_str);
free(c_str_ptr as *mut libc::c_void);
}
}
这里要注意内存管理,在Rust中调用C函数分配的内存,使用完后需要调用C的free
函数释放内存,否则会导致内存泄漏。