C/C++中size_t潛在的問題


  在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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM