Rust Vec到Ruby阵列,带有FFI Segfaults

Rust Vec到Ruby阵列,带有FFI Segfaults,ruby,rust,ffi,ruby-ffi,Ruby,Rust,Ffi,Ruby Ffi,我试图返回一个可以从外部rust函数转换为Ruby数组的结构,但当我试图调用该结构作为方法时,我得到了一个segfault 使用libc::size\t; #[报告员(C)] 发布结构数组{ len:libc::size\u t, 数据:*常量libc::c_void, } impl阵列{ fn from_-vec(mut-vec:vec)->数组{ vec.收缩到合适的尺寸(); 设array=array{data:vec.as_ptr()as*const libc::c_void,len:v

我试图返回一个可以从外部rust函数转换为Ruby数组的结构,但当我试图调用该结构作为方法时,我得到了一个segfault

使用libc::size\t;
#[报告员(C)]
发布结构数组{
len:libc::size\u t,
数据:*常量libc::c_void,
}
impl阵列{
fn from_-vec(mut-vec:vec)->数组{
vec.收缩到合适的尺寸();
设array=array{data:vec.as_ptr()as*const libc::c_void,len:vec.len()as libc::size_t};
mem::忘记(vec);
排列
}
}
#[没有损坏]
pub extern fn get_链接(url:*const libc::c_char)->数组{
//获取链接
让mut URL:Vec=Vec![];
//将字符串推送到URL向量中
//URL=>collections::vec::vec
数组::from_vec(URL)
}
要求“外国金融机构”
模块锈蚀
扩展FFI::库
ffi_lib'./bin/libembed.dylib'
类NodesArray

当我尝试在ruby中使用此函数时,它将返回Fii::NodesArray。我还可以从结构中获取len和数据。只有当我调用#to_a时,才会出现故障。

似乎
FFI::Pointer#get_array_of _string中的#get_array_被窃听了(或者它没有做我认为它会做的事情)。如果我更改此行,您的代码对我有效:

self[:data].get_array_of_string(0, self[:len]).compact
为此:

Array.new(self[:len]) {|i| self[:data].read_pointer[i * FFI::Pointer::SIZE].read_string }
作者指出,问题在于,我在向Vec施加压力。FFI需要
*常量libc::c_char
,可以从
字符串转换而来

let mut urls: Vec<*const libc::c_char> = vec![];

urls.push(CString::new(string_var.value.to_string()).unwrap().into_raw());
让mut url:Vec=Vec![];
push(CString::new(string_var.value.to_string()).unwrap().into_raw());

我不熟悉Ruby FFI,但。。。
len
data
是否应该反转?它是Rust中的
data
len
,但Ruby.Hmm中的
len
data
。说得好。但是我相信我在某个时候把它们放在了正确的布局中,并且仍然有缺陷。我将尝试切换该选项并更新问题。现在,您的源代码中有两个独立的
数组
结构定义。。。请将您使用的代码作为一个旁注,您可能需要考虑使用<代码> STD::FFI:cString < /C> >而不是<代码>字符串可怕。谢谢你,阿德里安。是的,CString是我应该使用的。但有一个问题是,我得到的字符串数组只指向数组中的第一个sting。所以我得到的数组是这样的:[,“www.google.com/webhp?tab=ww”,“le.com/webhp?tab=ww”,“ebhp?tab=ww”,“ebhp?tab=ww”,“ebhp?tab=ww”,“ebhp”,“\t”,“。我建议发布一个新问题,包括一个完整的示例程序、您得到的输出以及您的预期输出。没有这些信息很难帮助你。我在上面发布了修复程序。你给我指出了正确的方向,提醒我需要一个CString而不是字符串。