【问题标题】:Lua C API: Push pointers as a userdataLua C API:将指针作为用户数据推送
【发布时间】:2020-04-05 09:16:40
【问题描述】:

我有一个指向用户数据的指针地址。我这样检索地址:

*(uint32_t*)lua_touserdata(L, -1)

稍后,我想使用指针将该用户数据推回堆栈顶部。如果可以的话,应该怎么做?

【问题讨论】:

  • 如果你想存储一个用户数据的引用,以便以后可以将它推回 Lua 堆栈,我建议使用函数 luaL_refluaL_unref

标签: c api lua


【解决方案1】:

您可以在检索到指向您已通过 lua_newuserdata() 创建的用户数据的指针后创建新的用户数据。然后将指针的基础值设置为第一个 userdata 的基础值的值。它应该看起来像这样:

int *ud1 = lua_touserdata( L, -1 ); // Get userdata previously created

int *ud2 = lua_newuserdata( L, sizeof( int ) ); // Create new userdata
*ud2 = *ud1; // Set value of new userdata to the value of the previous userdata

// Userdata has been successfully "pushed"
assert(
        *( (int*) lua_touserdata( L, -1 ) ) == 
        *( (int*) lua_touserdata( L, -2 ) ) 
);

【讨论】:

  • 我的断言通过了。我是否错误地假设我可以在“*ud2 = *ud1;”之后继续添加到堆栈中?例如 lua_getfield(-1, "field")
  • 是的,你是对的。我给出的示例中所做的不会阻止您添加到堆栈中。
猜你喜欢
  • 2013-02-08
  • 2014-09-14
  • 2012-06-28
  • 1970-01-01
  • 2016-07-05
  • 2016-12-07
  • 2021-12-27
  • 2020-11-17
  • 2021-10-05
相关资源
最近更新 更多