作者deo2000 (800IM)
看板C_and_CPP
標題Re: [問題] 大約一半機率會記憶體錯誤的字串處理函式
時間Thu Oct 6 13:47:12 2016
感謝各位建議
目前修改過以後,還是會有3成機會在某一行出錯
如果程式很久才跑一次就正常,密集重複執行就比較可能會出錯。
程式碼
http://pastebin.com/BRZNwk0Q
只要出錯就是固定在 while 的第2行, realloc 那邊
錯誤訊息: free(): invalid next size (normal): 0x000000000076d7e0
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.205.43
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1475732835.A.AB4.html
※ 編輯: deo2000 (125.227.205.43), 10/06/2016 13:48:15
感謝, 因為是純C,所以我把 bool true false 改 int 1 0
會有2成機會發生另一個錯誤 malloc(): memory corruption:
在第一個 puts("debug mark") 之前發生
2F:→ pttworld: realloc的參數和回傳值可以嘗試不同變數。 10/06 13:59
※ 編輯: deo2000 (125.227.205.43), 10/06/2016 14:28:26
※ 編輯: deo2000 (125.227.205.43), 10/06/2016 14:29:36
3F:→ x000032001: 其他地方沒有非法存取嗎..這heap被寫爆了 10/06 14:56
先暫時用比較笨的作法組合字串,求穩定先QQ
不然程式無法繼續寫下去
※ 編輯: deo2000 (125.227.205.43), 10/06/2016 14:58:01
4F:→ x000032001: 我指的是 有可能其他地方寫壞 只是這裡剛好free才爆炸 10/06 15:00
5F:推 LPH66: strncpy 在你給的大小到達時「不會」把結尾的'\0'寫進去 10/06 21:39
6F:→ LPH66: 不像 strncat 是會幫你加 '\0' 結尾的 10/06 21:39
7F:→ LPH66: 因此 strncpy 那行製造了一個沒有結束的字串, 問題應該在這 10/06 21:40
8F:→ LPH66: 如果你真的確定你計算的空間是足夠的, 那可以不需要 n 版 10/06 21:41
9F:→ LPH66: 直接用普通的 strcpy / strcat 即可 10/06 21:41
10F:推 stupid0319: 如果是大約固定長度字串,沒必要用calloc來申請空間 10/07 01:27
11F:→ stupid0319: 或者申請一次空間就好,不要一直calloc一直free 10/07 01:28
12F:推 dragon0414: 有先確保realloc要到的空間有被清為0嗎? 如果有殘值, 10/14 14:33
13F:→ dragon0414: 在操作strncpy & strncat時可能會有意料外的行為 10/14 14:34