lual_newstate在main函数之外

dyn*_*eed 1 c++ lua

我正在使用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调用时第二个段错误,第三个工作正常.这里发生了什么?

Ale*_*rty 5

在第二个例子中,这个函数:

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传递给第三个变量时,该函数可以使用传递给它的地址更改该变量的值.