Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Lua 从Rust函数返回要用FFI调用的字符串_Lua_Rust_Ffi_Luajit - Fatal编程技术网

Lua 从Rust函数返回要用FFI调用的字符串

Lua 从Rust函数返回要用FFI调用的字符串,lua,rust,ffi,luajit,Lua,Rust,Ffi,Luajit,我想让解释语言(特别是LuaJIT)调用一个返回字符串的Rust函数 在我解引用指针之前,我所拥有的崩溃了 我读到Rust字符串不是以null结尾的,所以我使用to_c_str()函数来生成一个字符串,也就是说,但我认为生命周期不知何故给整个事情带来了麻烦,因为我对它们仍然有些模糊 防锈代码: #![板条箱类型=“dylib”] 外部板条箱libc; #[没有损坏] pub extern“C”fn hello_world()->std::C_str::CString{ “你好,世界”。致_c_s

我想让解释语言(特别是LuaJIT)调用一个返回字符串的Rust函数

在我解引用指针之前,我所拥有的崩溃了

我读到Rust字符串不是以null结尾的,所以我使用
to_c_str()
函数来生成一个字符串,也就是说,但我认为生命周期不知何故给整个事情带来了麻烦,因为我对它们仍然有些模糊

防锈代码:

#![板条箱类型=“dylib”]
外部板条箱libc;
#[没有损坏]
pub extern“C”fn hello_world()->std::C_str::CString{
“你好,世界”。致_c_str()
}
Lua代码:

本地外国金融机构=要求(“外国金融机构”)
外国金融机构[[
char*hello_world();
]]
本地hello\u world=ffi.load(“hello\u world”)
local hw=hello\u world.hello\u world()

A
CString
不仅仅是一个指针;它指示
CString
是否拥有C字符串。因此,Lua代码中的声明与Rust代码中的定义不匹配

使用
CString
上的方法返回
*const c_char
*mut c_char
。如果函数返回动态分配的字符串,则还需要提供一个函数来释放Lua代码需要手动调用的字符串,否则将导致内存泄漏。

正确。这是完整的工作解决方案

防锈代码:

#![板条箱类型=“dylib”]
外部板条箱libc;
#[没有损坏]
pub extern“C”fn hello_world()->*const libc::C_char{
不安全{“你好,世界”。到_c_str().unwrap()}
}
Lua代码:

本地外国金融机构=要求(“外国金融机构”)
外国金融机构[[
char*hello_world();
]]
本地hello\u world=ffi.load(“hello\u world”)
local hw=ffi.string(hello\u world.hello\u world())

工作正常。谢谢