首页 > 解决方案 > 如何将 char** 转换为 Vec生锈

问题描述

我有一个 rust 静态库,它正在链接 int ac 项目。在大多数情况下,它运行良好。但是我不知道如何将 c char* 数组传递给 rust 并将其转换为 rust Vec。

我的 C 代码:

int rust_main(int argc, char** argv);

int main(int argc, char **argv)
{
    rust_main(argc, argv);
    return 0;
}

我的锈代码:

#[no_mangle]
pub unsafe extern "C" fn rust_main(argc : c_int , argv : &[*mut c_char]) -> c_int {

    let arglen = argc as usize;
    println!("Args: {}", argc);


    for x in 0..arglen {
        let var = CString::from_raw(argv[x]);
        let printable = var.to_string_lossy();
        println!("{}", x);
    }
}

代码编译得很好,但是当我尝试访问字符串指针数组时,我得到了一个核心转储。

如果有人能指出我正确的方向,将不胜感激。

标签: crustffi

解决方案


文档中:

其他用法(例如,尝试获取由外部代码分配的字符串的所有权)可能会导致未定义的行为或分配器损坏。

注意:如果需要借用外部代码分配的字符串,请使用 CStr。

您应该调用,然后根据需要使用或CStr::from_ptr转换为拥有的值。to_strto_string_lossyinto_c_string

#[no_mangle]
pub unsafe extern "C" fn rust_main(argc : c_int , argv : &[*mut c_char]) -> c_int {

    let arglen = argc as usize;
    println!("Args: {}", argc);


    for x in 0..arglen {
        let var = CStr::from_ptr(argv[x]);
        let printable = var.to_string_lossy();
        println!("{}", x);
    }
}

推荐阅读