C++推送std::string vector至Lua时返回nil的问题排查
问题原因
你的代码存在两处核心逻辑错误,导致返回的表为空,大概率是你Lua侧把空表误判为了nil:
- 循环触发条件错误:示例中
foundedEvents仅插入了1个元素,长度为1,你的循环变量i从1开始,判断条件为i < foundedEvents.size(),也就是1 < 1,条件不成立,循环完全不会执行,最终创建的是没有任何元素的空表。就算vector元素更多,这个逻辑也会漏掉第一个元素,还会导致vector下标越界。 - C与Lua的下标对应错误:C的
std::vector下标从0开始,Lua数组风格的表默认下标从1开始,直接用Lua侧的下标取vector元素必然错位。
修复后的代码
static int Lua_Extract(lua_State* L) { std::vector<std::string> foundedEvents; foundedEvents.push_back("xx"); lua_createtable(L, foundedEvents.size(), 0); int newTable = lua_gettop(L); // 修正循环逻辑:Lua侧下标从1开始,对应vector下标为i-1 for (size_t i = 0; i < foundedEvents.size(); i++) { lua_pushstring(L, foundedEvents[i].c_str()); lua_rawseti(L, newTable, i + 1); } return 1; }
额外检查点
如果修复后仍然返回nil,你可以额外检查两处:
- 确认你注册该C函数到Lua环境的逻辑没有错误,函数名和Lua侧调用的名称完全一致
- 确认C++侧的字符串编码和Lua侧的编码兼容,不会因为编码异常导致字符串压栈失败
内容的提问来源于stack exchange,提问作者Berkay Karatas
相关产品推荐
相关产品推荐

