我正在使用Lua5.1在一个C++应用程序中嵌入Lua,而我对luaL_newstate()有一个奇怪的问题.
这有效:
lua_State *L = NULL;
int main()
{
L = luaL_newstate();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我最近重新构建了我的代码,并选择创建一个这样的init函数:
lua_State *L = NULL;
void init_lua(lua_State *L)
{
L = luaL_newstate();
}
int main()
{
init_lua(L);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这不起作用.出于某种原因,luaL_newstate()在这种情况下总是返回NULL.但是,为了增加混乱,这确实有效:
lua_State *L = NULL;
void init_lua(lua_State **L)
{
*L = luaL_newstate();
}
int main()
{
init_lua(&L);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
从功能上来说,我没有看到第二个和第三个例子之间的区别,但是当我尝试使用L进行lua调用时第二个段错误,第三个工作正常.这里发生了什么?
在第二个例子中,这个函数:
void init_lua(lua_State *L)
{
L = luaL_newstate();
}
Run Code Online (Sandbox Code Playgroud)
您将L设置为luaL_newstate()的返回值.L是指向lua_state的指针.但是,您只是更改了L的参数版本.
在你的第三个例子中:
void init_lua(lua_State **L)
{
*L = luaL_nwstate();
}
Run Code Online (Sandbox Code Playgroud)
您将L指向的值(这是您的全局定义的L)设置为luaL_newstate()的返回值.所以你要改变传递给函数的实际变量.
总结:当您在第二个示例中传递VALUE时,该函数无法更改原始变量.但是当您将POINTER传递给第三个变量时,该函数可以使用传递给它的地址更改该变量的值.