Некоторые абстракции данных невозможно хранить в C-коде в чистом виде. - Их реализации "скрыты" за луашным API. К таким данным относятся, наприер, lua-таблицы.
В типичном случае таблица по индексу LUA_REGISTRYINDEX используется для хранения метатаблиц пользовательских библиотек. Например, во время инициализации библиотеки создается метатаблица:
luaL_newmetatable(L, LIBNAME); // создаем метатаблицу на стэке
// ... - какой-то код, наполняющий созданную таблицу
lua_rawsetp(L, LUA_REGISTRYINDEX, (void*)METAKEY); // устанавливаем метатаблицу по уникальному ключу
Затем, при генерации нового библиотечного объекта, ему устанавливается ранее созданная метатаблица:
int object_new(lua_State *L)
{
char *ud = lua_newuserdata(L, UDSIZE); // создаем новый объект
lua_rawgetp(L, LUA_REGISTRYINDEX, (void *)METAKEY); // извлекаем ранее созданную метатаблицу
lua_setmetatable(L, -2); // устанавливаем метатаблицу для созданного объекта
return 1;
}