Lua如何将userdata从元表索引放入C闭包?

Lua如何将userdata从元表索引放入C闭包?,c,lua,closures,metatable,C,Lua,Closures,Metatable,我有创建用户数据和小图元表的功能 static int index_lua(lua_State *L){ uint32_t * x; x = lua_touserdata(L, 1); printf("Buff __index ADDR: %08X\r\n", x); return 0; } static int gc_lua(lua_State *L){ printf("Buff GC!\r\n"); r

我有创建用户数据和小图元表的功能

static int index_lua(lua_State *L){
    uint32_t * x;
    x = lua_touserdata(L, 1);
    printf("Buff __index ADDR: %08X\r\n", x);
    return 0;
}

static int gc_lua(lua_State *L){
    printf("Buff GC!\r\n");
    return 0;
}

static int create_buff(lua_State *L){
    uint32_t * x;

    x = (uint32_t *) lua_newuserdata(L, 512);
    printf("BUff ADDR: %08X\r\n", x);
    *x = 0;

    lua_newtable(L);
    lua_pushcfunction(L, index_lua);
    lua_setfield(L, -2, "__index");
    lua_pushcfunction(L, gc_lua);
    lua_setfield(L, -2, "__gc");
    lua_setmetatable(L, -2);

    return 1;
}

我想在索引中创建新的C函数,并将userdata放入他的闭包(upvalue),但我无法理解它是如何实现的。我可以把一个指针指向userdata。但我认为这是个坏主意,因为Lua在垃圾收集时可以删除userdata,如果他不知道在某些函数中使用的是什么用户数据。

需要从堆栈中删除函数索引的第二个参数,在关闭堆栈的一个元素后,它将是userdata

static int index_lua(lua_State *L){
    uint32_t * x;
    x = lua_touserdata(L, 1);
    printf("Buff __index ADDR: %08X\r\n", x);
    lua_pop(L,1); // Remove second param __index
    lua_pushcclosure (L, test, 1); // put on stack 1 element of stack
    return 1;
}

需要从堆栈中删除函数_索引的第二个参数,在out之后关闭堆栈的一个元素,它将是一个userdata

static int index_lua(lua_State *L){
    uint32_t * x;
    x = lua_touserdata(L, 1);
    printf("Buff __index ADDR: %08X\r\n", x);
    lua_pop(L,1); // Remove second param __index
    lua_pushcclosure (L, test, 1); // put on stack 1 element of stack
    return 1;
}