Lua C API 构建的嵌套表导致崩溃

我正在尝试在 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);

    // 创建根表
    lua_newtable(L);

    // 将 DEPTH 层推入表中
    for (i=0; i<DEPTH; i++)
    {
        lua_pushstring(L, "subtable");
        lua_newtable(L);
    }

    // 将 DEPTH 层嵌套
    for (i=0; i<DEPTH; i++)
    {
        lua_settable(L, -3);
    }

    lua_close(L);

    return 0;
}
点赞
用户107090
用户107090

你需要通过 lua_checkstackluaL_checkstack 来增加栈的大小,以使得有 2*DEPTH 个插槽可用。

2016-09-01 23:44:45