C++ &引用;铸造;Lua表到Lua表的地址

C++ &引用;铸造;Lua表到Lua表的地址,c++,lua,lua-table,C++,Lua,Lua Table,假设我有一个表的地址——我如何向它“强制转换”一个表变量?我不担心“坏习惯”或崩溃,因为这只是个人问题 我想做一些像 lua\u表选项卡=*(lua\u表*)0xaddr …但在Lua全球环境中 我知道这有多糟糕,但我真的需要知道这是否可能。这可能不是我想做的最好的方法,但我很确定这是最简单的,如果可能的话,它会起作用。我正在使用Lua 5.1.4。为了完成您正在尝试的操作,您必须: 获取指向Lua表的数据结构的指针。我相信你相信你已经有了这样一个指针。但是Lua中没有任何东西可以保证(通过某种

假设我有一个表的地址——我如何向它“强制转换”一个表变量?我不担心“坏习惯”或崩溃,因为这只是个人问题

我想做一些像
lua\u表选项卡=*(lua\u表*)0xaddr
…但在Lua全球环境中


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

为了完成您正在尝试的操作,您必须:

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

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

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

  • 查找Lua用于正确操作此表的内部API。这显然是某种哈希表,但您需要使用Lua的函数来实际处理它

    粗略检查一下Lua的内部结构,可以在
    ltable.h
    中找到该代码。然而,可能还有更多的API。另外,请注意,这些API中有许多采用了
    lua_状态
    ,因此它们可能会进行一些堆栈修改

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

  • 即使如此,这:

    Table tab = *(Table*)0xaddr
    
    这是行不通的。或者至少,不是你想的那样。LUA是在C.写的,这意味着<代码>表< /> >不会像C++值类型那样工作。复制它将只执行按位复制。因此,修改
    选项卡
    只会修改这些值的本地副本。如果这些是指向其他数据结构的指针,那可能没问题,因为您的指针和原始指针指向相同的数据结构。但是,如果您执行一些更改表上的
    Table::flags
    字段的操作,例如,存储在Lua中的表不会受到影响,只会更改本地
    选项卡
    副本

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

    Table *tab = reinterpret_cast<Table*>(0xaddr);
    
    Table*tab=reinterpret\u cast(0xaddr);
    
    Lua没有为此公开API


    修复你的设计比强迫它工作更容易、更可靠。

    你是如何得到地址的?@user我想他是
    把它串起来的。“我很确定这是最简单的,如果可能的话它会工作的”我很确定你认为什么是“最简单的”做任何你想做的事情的方法,肯定不是最简单的方法。也许吧,但我想试试。我不确定问题是什么。你已经知道这很糟糕了。你已经知道如何做这件坏事(通过铸造)。那么你问的是什么?