Lua/C++ - 尝试遍历表时出现的lua_next()段错误
2017-7-29 11:35:48
收藏:0
阅读:79
评论:2
我在 C++ 中有以下代码:
lua_getglobal(C, "theTable");
lua_pushnil(C);
while (lua_next(C, -2) != 0) {
/* snip */
}
然而,当它运行时,会报告 segfault。LLDB 的停止消息如下。
* thread #1: tid = 0x50663f, 0x000000000002b36a luaos`luaH_next + 58, queue =
'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x38)
frame #0: 0x000000000002b36a luaos`luaH_next + 58
Luaos 是可执行文件名。为了可移植性,我已将 Lua 直接编译到可执行文件中。
附注:C 是 lua 状态的名称。它是我的第二个配置 lua 状态(与我的主要代码 lua 状态 L 相对),这就是命名背后的原因。
点赞
用户929395
似乎您的代码只是部分正确的,我将详细说明如何使用lua_next,包括您的代码正确的部分。
lua_next希望栈中至少有两个元素(以以下顺序):
[1] 上一个键
...
[t] table
在第一次调用函数时,previous key应为nil,因此函数将把第一个键值对推送到栈中,并开始遍历。
lua_getglobal(L, "theTable"); // 栈中的表
// ...
lua_pushnil(L); // 压入nil
lua_next(L, t); // t是theTable索引
调用lua_next后,弹出先前的键并将键值对推送到栈中,如下所示:
[1] 值
[2] 键
...
[t] -- 未知值 --
[t+1] table
如果使用此栈再次调用函数,则value作为当前键,table作为未知值,因此会发生错误。为了避免这种情况,应该弹出栈顶的[1] value:
lua_pop(L, 1); // 弹出值
现在栈中将具有继续遍历所需的预期值,lua_next可以再次调用。当表中没有更多元素时,函数将返回0。
这是一个完整的例子:
lua_getglobal(L, "theTable"); // 栈中的表
lua_pushnil(L); // 压入nil
while(lua_next(L, -2) != 0) {
// 处理key-value对
lua_pop(L, 1); // 弹出值
}
2017-01-03 05:00:17
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我看到了三个潜在的问题:
全局变量
theTable不存在,位置-2上有一个空值。在循环中你使用
lua_tostring将键转换为字符串,也许是为了打印。手册 说这会让lua_next混淆。在第一次循环迭代后,位置
-2上有其他值。请注意,lua_next将两个值推入栈中,即键和值。在再次调用lua_next之前,您需要将键保留在堆栈顶部。而且,确保表位于位置-2。可能最好在lua_getglobal之后将-2转换为绝对位置。但你仍然需要在每次迭代后将lua_next返回的键留在堆栈顶部。