2017-01-19 155 views
2

我想将用于存储字符串的Lua表传递给c函数。因此,例如,如果我有LuaJIT ffi:如何将字符串数组传递给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开始。所以我仍然不知道大多数的东西..

回答

2

这是一个简单的例子:

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 - 一般来说,是的,必须保持对活着的字符串的引用。但是,只要包含它的函数(实际上是它的原型)不被垃圾收集,字符串文字就会自动保持活动状态。 –

+2

这对我有用。另外,我刚刚发现,如果我们不想分配固定大小的数组,那么我们可以使用VLA使用“const char * [?]”语法,然后传递元素的数量。 。 –