"Cast"地址Luatable到Luatable

"Cast" the address of a Lua table to a Lua table

假设我有一个 table 的地址 - 我如何 "cast" 一个 table 变量给它?我不担心 "bad practice" 或崩溃,因为这只是个别问题。

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

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

为了完成您的尝试,您必须:

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

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

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

  3. 找到 Lua 用来 操纵 这个 table 的内部 APIs 。它显然是某种散列 table,但您需要使用 Lua 的函数才能对其进行实际操作。

    粗略检查 Lua 的内部结构表明可以在 ltable.h 中找到此代码。但是,可能还有更多 API 。另外,请注意,其中许多 API 都采用 lua_State,因此它们可能会进行一些堆栈调整。

    您还需要通读 Lua 的 API,这样您就可以在不 破坏 的情况下学习如何使用它们 table. Lua 可能对某些函数何时被调用或它们之间的顺序或其他有某些期望。打破这些后果自负。

即便如此,这:

Table tab = *(Table*)0xaddr

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

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

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

Lua 没有公开 API 这样做。

修复您的设计而不是试图强制它工作会更容易,更强大