在C++中,利用数组下标访问数组元素时,常常将下标类型定义为size_t类型,因为正常来说,数组的下标就是size_t类型。例如这样:
for (size_t i = 0; i < container.size(); ++i)
然而具体来说,size_t是一个和机器相关的unsigned类型。重点就在于... size_t是一个unsigned类型的数值类型。因而,在C/C++中涉及到size_t和int型数据转换传递时,就需要注意...
尽管这个问题经常被老师和书籍指出来需要重视,然而今天还是踩了坑...
如下,是我写的一个快排(quicksort),实现对std::vector中的元素(类型由模板确定)进行升序排序(默认该类型定义了<=, >符号操作):
在程序运行时就会发现,这个代码... 偶尔会出现问题(怪我数据规模设定得小,给了它正确的机会...)。
找了好久都没找到... (哭...),然后用Xcode监测了一下(这里吹一下Xcode,因为我暂时还不太会用lldb...)。终于,发现了问题,就是图片中第12行: 当j值为0时,再自减,就会变成一个很大的数值,自然就数组越界了... (当然,数组下标为任意负值时,也会导致这个问题,因此直接导致出现这种问题的原因,也是数组越界)
目前的解决方法是将这些size_t老老实实地定义成了int类型,暂时搞定了这个bug...
以后有好的办法再重整(Zhěng)...
有更好方法建议的朋友,敬请评论区斧正,感谢。
@编辑于2019.3.1