当我运行以下代码时:
pState = luaL_newstate();
if( !pState )
return false;
luaL_requiref( pState, "_G", luaopen_base, 1 );
luaL_requiref( pState, "table", luaopen_table, 1 );
luaL_requiref( pState, "string", luaopen_string, 1 );
luaL_requiref( pState, "math", luaopen_math, 1 );
luaL_requiref( pState, "debug", luaopen_debug, 1 );
luaL_requiref( pState, "package", luaopen_package, 1 );
lua_pop( pState, 6 );
// Clear stack
lua_settop( pState, 0 );
//...
lua_newtable( pState );
lib_indx = lua_gettop( pState );
CLuaManager::PrintStack( pState );
lib_indx
的值为0,我的PrintStack
函数(与documentation中的函数相同)表明堆栈为空。但是,如果我尝试执行任何使用该值在堆栈顶部的操作,它们将像表在堆栈顶部那样工作。例如,以下代码:
lua_newtable( pState );
lib_indx = lua_gettop( pState );
lua_setglobal( pState, "TestTable" );
不会导致错误,并且可以通过脚本访问表“ TestTable”:
function dump(o)
if type(o) == 'table' then
local s = '{ '
for k,v in pairs(o) do
if type(k) ~= 'number' then k = '"'..k..'"' end
s = s .. '['..k..'] = ' .. dump(v) .. ','
end
return s .. '} '
else
return tostring(o)
end
end
print("TestTable:", dump(TestTable))
对行lua_setglobal( pState, "TestTable" );
进行注释会导致TestTable: nil
的输出,而对注释不注释会导致TestTable: { }
。这表明表已被设置为全局值TestTable
。但是,lib_indx
仍为零!那么Lua在哪里找到桌子?
答案 0 :(得分:0)
我发现了行为的根源。错位的lua_pop
显然导致堆栈的大小为负数,因此将新表添加到了堆栈中,但是索引意外。