lual_newstate在主函数之外

我正在使用Lua5.1在一个C++应用程序中嵌入Lua,我遇到了一个关于luaL_newstate()的奇怪问题。

这个是可以的:

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

最近我重构了我的代码,并选择创建一个类似于这样的初始化函数:

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调用时会有段错误,而第三个示例可以正常工作。这里发生了什么?

原文链接 https://stackoverflow.com/questions/3680667

点赞
stackoverflow用户429435
stackoverflow用户429435

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

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()的返回值。因此,你正在改变传递给函数的实际变量。

总之:当在第二个例子中传递值时,函数无法更改原始变量。但是,当你在第三个例子中传递变量的指针时,函数可以使用你传递给它的地址来改变该变量的值。

2010-09-09 21:34:40