在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