我有一个生锈静态库,它在c++项目中被链接。它在很大程度上运作良好。但是,我不知道如何将c char*数组传递到铁锈中,并将其转换为锈蚀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);
}
}但是,当我试图访问字符串指针数组时,代码编译得很好,我得到了一个Core转储。
如果有人能为我指明正确的方向,我将不胜感激。
发布于 2019-08-15 09:40:03
来自文档
其他使用(例如,试图获取由外部代码分配的字符串的所有权)可能会导致未定义的行为或分配器损坏。 注意:如果您需要借用由外部代码分配的字符串,请使用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);
}
}发布于 2019-08-16 09:52:04
您不能与C代码共享片(实际上是不可能的)。
我试着做一个例子,可以将argv转换为String。
use libc::{c_char, size_t, c_int};
use std::ffi::CStr;
use std::slice::from_raw_parts;
use std::str::Utf8Error;
pub unsafe fn convert_double_pointer_to_vec(
data: &mut &mut c_char,
len: size_t,
) -> Result<Vec<String>, Utf8Error> {
from_raw_parts(data, len)
.iter()
.map(|arg| CStr::from_ptr(*arg).to_str().map(ToString::to_string))
.collect()
}
#[no_mangle]
pub unsafe extern "C" fn rust_main(argc : c_int , data: &mut &mut c_char) -> c_int {
let argv = convert_double_pointer_to_vec(data, argc as size_t);
if let Ok(mut argv) = argv {
for (i, arg) in argv.iter_mut().enumerate() {
arg.insert_str(0, &format!("{}: ", i));
}
println!("{:#?}", argv);
0
}
else {
1
}
}https://stackoverflow.com/questions/57507413
复制相似问题