【问题标题】:"Cast" the address of a Lua table to a Lua table将 Lua 表的地址“转换”为 Lua 表
【发布时间】:2016-04-08 11:17:08
【问题描述】:

假设我有一个表的地址 - 我如何将一个表变量“转换”到它?我不担心“不良做法”或崩溃,因为这只是个人问题。

我想做类似的事情 lua_table tab = *(lua_table*)0xaddr ...但在 Lua 全局环境中。

我知道这有多糟糕,但我真的需要知道这是否可能。这可能不是做我想做的事情的最好方法,但我很确定这是最简单的,如果可能的话,它会起作用。我正在使用 Lua 5.1.4。

【问题讨论】:

  • 你是怎么得到地址的?
  • @user 我假设他 tostring'd 它。
  • “我很确定这是最简单的,如果可能的话,它会起作用”我很确定无论你认为是做什么都是“最简单”的方法做,肯定不是“最简单”的方法。
  • 也许可以,但我想试试。
  • 我不确定问题是什么。你已经知道这很糟糕。你已经知道如何做这件坏事(通过强制转换)。那你问的是什么?

标签: c++ lua lua-table


【解决方案1】:

Lua 没有为此公开任何 API。

修复您的设计而不是试图强迫它工作会更容易并且更多更健壮。

【讨论】:

    【解决方案2】:

    为了做你想做的事,你必须:

    1. 获取指向 Lua 表数据结构的指针。我确定你相信你已经有了这样的指针。但是 Lua 中没有任何东西可以保证您(通过某种方式)获得的指针实际上是指向表数据结构的指针。它可能是指向其他东西的指针。因此,您需要仔细检查 Lua 的内部结构,以确保无论您从何处获取此指针,都会为您提供指向实际对象的指针。

    2. 找到正确的类型,在 Lua 内部声明。 Lua 使用一些 C 类型(Lua 用 C 编写,而不是 C++)来表示主表数据结构。您将必须跟踪此结构定义并使用它。

      对 Lua 库的粗略检查表明,主表数据结构定义在 lobject.h 中,名称为 Table

    3. 找到 Lua 用来操作这个表正确的内部 API。这显然是某种哈希表,但您将需要使用 Lua 的函数来实际使用它。

      对 Lua 内部结构的粗略检查表明该代码可以在 ltable.h 中找到。但是,可能还有比这更多的 API。另外,请注意,其中许多 API 采用 lua_State,因此它们可能正在做一些堆栈摆弄。

      您还需要查看 Lua 的 API,以便了解如何在不破坏表格的情况下使用它们。 Lua 可能对何时调用某些函数或它们之间的顺序或其他什么有一定的期望。打破这些后果自负。

    即便如此,这个:

    Table tab = *(Table*)0xaddr
    

    永远不会工作。或者至少,不是你想要的方式。 Lua 是用 C 编写的。这意味着 Table 不会像 C++ 值类型那样工作。复制它只会按位复制。所以修改tab 只会修改这些值的本地副本。如果这些是指向其他数据结构的指针,那可能没问题,因为您的指针和原始指针指向相同的数据结构。但是如果你执行一些改变表上的Table::flags字段的操作,例如存储在Lua中的表不会受到影响,只有你本地的tab副本会受到影响。

    您必须将对象作为指针来操作,而不是原始的副本。

    Table *tab = reinterpret_cast<Table*>(0xaddr);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-24
      • 2012-07-24
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 2013-12-23
      • 2019-08-13
      • 2018-12-18
      相关资源
      最近更新 更多