LuaJIT ffi:如何将字符串数组传递给C函数

3
我希望将存储字符串的Lua表传递给C函数。例如,如果我有:
tStr = {"String1", "String2", "String3"}

如何传递给C函数。我想我需要调用ffi.new,但是我不确定使用哪种类型..

local cVar = ffi.new("??" , tStr)  -- I am not sure what to pass as type 

参数

在C函数中,我不确定如何访问整个数据,它会是指向字符串的字符串指针,**str吗?

void cFunction(**str); --What pointer type should be used here ??

抱歉,如果我错过了一些显而易见的问题。但我刚开始接触Lua和ffi,所以我还不知道大部分事情..
1个回答

4
这是一个简单的例子:
local ffi = require"ffi"
ffi.cdef"int execvp(const char*file, const char**argv);"
local arg = ffi.new("const char*[3]", {"ls", "-l"})
ffi.C.execvp(arg[0], arg)

请注意常数3(数组的大小)等于2(从Lua传递的字符串数量{"ls", "-l"})加1(数组中的最后一个元素实际上是零终止符)。

1
你可能需要将 {"ls", "-l"} 锚定到一个变量上,这样 Lua 就不会过早地对其进行垃圾回收。const char* 将会保持指向表中这些字符串字面量的指针。 - greatwolf
1
@greatwolf - 一般来说,是的,必须保持对字符串的引用。但是只要包含它的函数(实际上是其原型)没有被垃圾回收,字符串字面量就会自动保持活动状态。 - Egor Skriptunoff
2
这对我有用。另外,我刚刚发现,如果我们不想分配固定大小的数组,则可以使用VLA,使用“const char * [?]”语法,然后传递元素数量。 - Pranav Maniar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接