c - 如何将 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);
}
}
代码编译得很好,但是当我尝试访问字符串指针数组时,我得到了一个核心转储。
如果有人能指出我正确的方向,将不胜感激。
解决方案
从文档中:
其他用法(例如,尝试获取由外部代码分配的字符串的所有权)可能会导致未定义的行为或分配器损坏。
注意:如果需要借用外部代码分配的字符串,请使用 CStr。
您应该调用,然后根据需要使用或CStr::from_ptr
转换为拥有的值。to_str
to_string_lossy
into_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);
}
}
推荐阅读
- list - 标记列表受保护 - Mathematica - 多变量矩阵方程
- c# - 从另一个类调用 MainActivity 方法时出错
- javascript - If 语句显示 NaN 消息而不是自定义警报
- swift - 数据库不存在 - 使用 Vapor 3 和 Fluent 的服务器端 Swift 中的 PostgreSQL
- python - 如何从 Oracle DB 中以 MDSYS 格式读取几何数据并转换为 shapely 格式或 GeoJson?
- matlab - 当我使用 X 和 Y 的历史数据对变量“Y”进行一些可用预测时,如何为变量“X”选择正确的预测方法?
- sql - 如何连接两个具有相同主键值的行数不等的表
- django - Django admin:更改日期和日期时间格式
- google-apps-script - 将数据从 Bigquery 加载到 Datastudio - 错误
- node.js - Node.js http-server 2 个文件夹