В дополнение к ответу Тима вы также можете выбрать light userdata. Вы не получите копию своих данных в стеке Lua, все, что вы нажимаете на Lua, это указатель.
Lua не понимает, что находится в этом указателе, указывает ли он на действительную память или как получить доступ к любым объектам в этом указателе, поэтому вам придется обрабатывать все это самостоятельно в C. Обычно я отправляю указатель на элемент в списке, так что, если есть риск, что запись была удалена из списка, я сначала перебираю список, чтобы проверить указатель (не так уж и много, если ваши списки короткие). Чтобы получить доступ к элементам внутри указателя в Lua, вам нужно написать функции get / set в C, которые вы можете вызывать из Lua.
Чтобы начать, вот записи о получении и получении данных lightuserdata: