lual_newstate在main函数之外

时间:2010-09-09 21:19:50

标签: c++ lua

我正在使用Lua5.1将Lua嵌入到C ++应用程序中,并且我对luaL_newstate()有一个奇怪的问题。

这有效:

lua_State *L = NULL;
int main()
{
   L = luaL_newstate();
   return 0;
}

我最近重构了我的代码,并选择创建一个这样的init函数:

lua_State *L = NULL;
void init_lua(lua_State *L)
{
   L = luaL_newstate();
}
int main()
{
   init_lua(L);
   return 0;
}

这不起作用。出于某种原因,luaL_newstate()在这种情况下总是返回NULL。但是,为了增加混乱,这确实有效:

lua_State *L = NULL;
void init_lua(lua_State **L)
{
   *L = luaL_newstate();
}
int main()
{
   init_lua(&L);
   return 0;
}

从功能上讲,我没有看到第二个和第三个例子之间存在差异,但是当我尝试使用L进行lua调用时,第二个段错误就没有了,第三个工作正常。这里发生了什么?

1 个答案:

答案 0 :(得分:5)

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

void init_lua(lua_State *L)
{
  L = luaL_newstate();
}

您将L设置为luaL_newstate()的返回值。 L是指向lua_state的指针。但是,您只是更改L的参数版本。

在你的第三个例子中:

void init_lua(lua_State **L)
{
  *L = luaL_nwstate();
}

您正在将L指向的值(这是您的全局定义的L)设置为luaL_newstate()的返回值。所以你要改变传递给函数的实际变量。

总结:当您在第二个示例中传递VALUE时,该函数无法更改原始变量。但是当您将POINTER传递给第三个变量时,该函数可以使用您传递给它的地址来更改该变量的值。