2010-09-09 56 views
1

我將Lua嵌入到使用Lua5.1的C++應用程序中,而我在使用luaL_newstate()時遇到了一個奇怪的問題。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; 
} 

功能,我不盡快看到第二個和第三個例子,但第二個內存設計缺陷之間的差異,因爲我嘗試LUA呼叫使用L和第三個工作很好。這裏發生了什麼?

+1

你有C++書嗎?關於將值傳遞給函數的含義是什麼? – GManNickG 2010-09-09 21:25:23

回答

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時,函數可以使用傳遞給它的地址來更改該變量的值。

+0

謝謝。我很高興我沒有失去理智。 – DynamiteReed 2010-09-10 06:03:49

+0

嗯,我只是希望我解釋正確。 – 2010-09-10 06:41:46