MST

星途 面试题库

面试题:Rust调用C代码时如何处理数据类型转换

在Rust调用C代码的场景下,举例说明Rust中的常见数据类型(如整数类型、字符串类型)如何与C语言中的对应数据类型进行转换,并给出简单代码示例。
17.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

整数类型转换

在Rust中,整数类型有i8i16i32i64u8u16u32u64等,在C语言中对应的有charshortintlongunsigned charunsigned shortunsigned intunsigned 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中,字符串有&strString两种主要类型。

假设我们有一个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函数释放内存,否则会导致内存泄漏。