使用Lua C API构建的嵌套表崩溃

时间:2016-09-01 21:26:12

标签: lua lua-table lua-c++-connection

我试图在Lua中创建一个深度嵌套的表。当我嵌套超过16级时,程序崩溃了。

在下面的示例程序中,当我将DEPTH更改为16而不是17时,程序不会崩溃。我找不到任何表示存在最大表深度的资源,而这么低的资源似乎很奇怪。崩溃是在对lua_close()的调用中。

我是否误解了如何使用C API在Lua中构建表,或者实际上是否存在最大深度?

#include <assert.h>
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"

#define DEPTH 17

int main(int argc, char* argv[])
{
    lua_State *L = NULL;
    size_t i = 0;

    L = luaL_newstate();
    assert(NULL!=L);

    luaL_openlibs(L);

    // create the root table
    lua_newtable(L);

    // push DEPTH levels deep onto the table
    for (i=0; i<DEPTH; i++)
    {
        lua_pushstring(L, "subtable");
        lua_newtable(L);
    }

    // nest the DEPTH levels
    for (i=0; i<DEPTH; i++)
    {
        lua_settable(L, -3);
    }

    lua_close(L);

    return 0;
}

1 个答案:

答案 0 :(得分:1)

您需要使用lua_checkstackluaL_checkstack来增加堆叠以允许2*DEPTH个广告位。