【问题标题】:LuaJIT FFI pass char** to C functionLuaJIT FFI 将 char** 传递给 C 函数
【发布时间】:2019-09-21 01:06:12
【问题描述】:

一直在尝试 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,所以任何指针不胜感激!

【问题讨论】:

    标签: lua ffi luajit


    【解决方案1】:

    我自己想出来的。显然这是由于以空结尾的 C 字符串占用了一个字符。

    这行得通:

    local c_encoded_token = ffi.new("char[?]", #encoded_token + 1, encoded_token)
    

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-22
      • 2014-07-20
      • 1970-01-01
      相关资源
      最近更新 更多