LuaJIT FFI传递char**到C函数

一直在尝试LuaJIT FFI,并遇到了一个奇怪的问题。我有以下代码:

local ffi = require("ffi")
ffi.cdef [[
    int decode(char* encodedToken, char** payload);
]]

local lib = ffi.load("lib.so")

local function decode(encoded_token)
    local c_encoded_token = ffi.new("char[?]", #encoded_token, encoded_token)
    local c_token = ffi.new("char*[1]")
    lib.decode(c_encoded_token, c_token)

    local resonse = ffi.string(c_token[0])
    return response
end

基本上,共享对象有一个解码传入令牌的方法,并将输出写入char**payload。奇怪的部分是,当我运行decode函数的单个迭代时,此代码可以正常运行,但在循环中运行时,则会导致Segmentation fault

这让我相信,我分配ffi.new("char*[1]")时有一个内存泄漏。我甚至尝试将其包装在ffi.gc调用中,也没有帮助:

local c_token = ffi.gc(ffi.new("char*[1]"), ffi.free)
-- do stuff
c_token = nil

这是我第一次尝试使用FFI,因此任何指针都将不胜感激!

点赞
用户114801
用户114801

我自己解决了。显然是由于以 null 结尾的 C 字符串占用了一个字符。

这个有效:

local c_encoded_token = ffi.new("char[?]", #encoded_token + 1, encoded_token)
2019-05-03 09:39:29