lual_newstate вне основной функции - PullRequest
1 голос
/ 10 сентября 2010

Я встраиваю Lua в приложение C ++, используя Lua5.1, и у меня странная проблема с 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;
}

Функционально я не вижу разницы между вторым и третьим примерами, и, тем не менее, второй segfaults, как только я пытаюсь вызвать lua, используя L, а третий работает просто отлично. Что здесь происходит?

1 Ответ

5 голосов
/ 10 сентября 2010

Во втором примере эта функция:

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 во втором примере, функция не может изменить исходную переменную.Но когда вы передаете указатель на свою переменную в своей третьей, функция может изменить значение этой переменной, используя адрес, который вы ей передали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...