1

Lightuserdata 与 userdata 不同,我能用它做什么?我的意思是lua中lightuserdata的操作。看起来我无法将其转换为任何其他数据类型。

我的一个案例:

我的 C 库返回一个名为“c_pointer”的 C 指针,又名 lightuserdata 到 Lua,然后我想要:

my_pointer = c_pointer +4

然后将'my_pointer'传回C库。因为我不能用 'c_pointer' 做任何事情,所以表达式 'c_pointer + 4' 是无效的。

我想知道有一些实用的解决方案吗?

4

2 回答 2

2

Lightuserdata 由 C 库创建。它们只是 C 指针。

例如,您可以使用它们来引用您分配的数据malloc,或在您的模块中静态分配。您的 C 库可以使用 将这些指针作为 lightuserdata 传输到 Lua 端lua_pushlightuserdata,稍后 Lua 可以将其返回给堆栈上的库(或其他 C 代码)。Lua 代码可以将 lightuserdata 用作任何其他值,将其存储在表中,例如,甚至作为表键。

附录

要回答您修改后的问题,如果您想为指针添加偏移量,请在 C 端进行。将 lightuserdata 和整数偏移量传递给 C,并让 C 使用ptr[n]

void * ptr = lua_touserdata(L, idx1);
lua_Integer n = lua_tointeger(L. idx2);
// do something with
((char *)ptr)[n];
于 2013-05-07T01:07:53.523 回答
0

普通 Lua 没有指针运算,因此正如Doug Currie所说,您需要在 C 端进行指针运算。

另一方面, LuaJIT可以进行指针运算(通过FFI库),因此请考虑使用它。

于 2013-05-07T00:54:22.043 回答