Luaプログラミング入門 > 第8章 C言語との連携 > Luaスタック > Luaスタックのサイズ


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

Luaスタックのサイズ 応援する

Luaスタックに値を積むことができる数には上限があります. スタックサイズの上限を超えて値を積むとスタックオーバーフローとなってしまいます. 通常はLUA_MINSTACK個(20に設定されている)だけスタックに値を積むことができます. 普通に使う分にはスタックの容量を気にする必要はないですが, もし大量の値を積みたい場合は注意が必要です.

次のサンプルコードはスタックオーバーフローが発生する例です.

#include <stdio.h>

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

int main (void)
{
        //このコードはエラーが発生する
        int i=0;
        lua_State* L = luaL_newstate();

        for(i=0; i < 100; i++) {
                lua_pushnumber(L, i + 1);
        }
        lua_close(L);
        return 0;
}

スタックの容量を増やすにはlua_checkstack関数を使用します.

int lua_checkstack (lua_State* L, int extra)

この関数はスタックにextra個の値の空きがあることを保障するための関数です. つまりスタックの容量を伸ばすための関数です. extra個だけ値を積むことができることが保障できればtrue(=1)を返し, そうでなければfalse(=0)を返します.

先ほどのエラーが発生したコードにlua_checkstack関数を加えると正常に動作します.

#include <stdio.h>

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

void dumpStack(lua_State* L)
{
        (略)
}

int main (void)
{
        int i=0;
        lua_State* L = luaL_newstate();

        if( lua_checkstack(L, 100) == 0 ) {
                printf("スタックの容量が確保できませんでした\n");
                return 1;
        }

        for(i=0; i < 100; i++) {
                lua_pushnumber(L, i + 1);
        }
        dumpStack(L);
        lua_close(L);
        return 0;
}

実行結果

Stack[100-    number] : 100.000000
Stack[99-    number] : 99.000000
        (略)
Stack[ 3-    number] : 3.000000
Stack[ 2-    number] : 2.000000
Stack[ 1-    number] : 1.000000

[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation