找回密码
 立即注册
首页 业界区 安全 Lua中使用#求含nil的数组长度漫谈

Lua中使用#求含nil的数组长度漫谈

薯羞 6 天前
Lua中含nil的数组长度

在lua中常常使用 “#” 来获取数组的长度,但仅对于数组中不存在nil值的情况,当数组中存在nil情况下则使用#获取的数组长度则变的不定,这里就来简单验证下。
试看以下代码片段:
  1. Lua 5.1.5  Copyright (C) 1994-2012 Lua.org, PUC-Rio
  2. > table1 = {nil,1,12,45,nil}
  3. > print(#table1)
  4. 4
  5. > table2 = {nil,nil,1,2,3,4}
  6. > print(#table2)
  7. 6
  8. > table3 = {nil,nil,1,2,3,4,nil,1,2,nil}
  9. > print(#table3)
  10. 6
  11. > a = 12
  12. > b = 13
  13. > c = 15
  14. > table4 = {nil,nil,a,b,c,154,nil,256}
  15. > print(#table4)
  16. 8
复制代码
先给出结论:

  • Lua 的 # 运算符会寻找最大的连续整数键 n,使得 table[n] 不为 nil,且 table[n+1] 为 nil
这条结论适用于table1 和 table3 情况

  • 如果表中存在 nil 空洞(即非末尾的 nil),# 的结果可能不符合预期
    结合table2 的长度数值来看。其长度计算方式是与结论一所对应的方式,即找出最大的非nil值连续区间的末尾元素,
    返回末尾元素的索引。
    而table4 如果也使用此规则则应该返回的是 数值154 对应的索引 6,而实际返回的结果却是 8
    来看DeepSeek给出的可能性分析:
1.png

​        因此可知,lua对于非nil结尾的含有nil的table 的# 求取长度的结果不定性。
总结:
在 Lua 中,# 运算符不适合用于含 nil 空洞的数组

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册