Re: [問題] 大約一半機率會記憶體錯誤的字串處理函式

看板C_and_CPP作者 (800IM)時間9年前 (2016/10/06 13:47), 9年前編輯推噓3(3010)
留言13則, 5人參與, 最新討論串2/2 (看更多)
感謝各位建議 目前修改過以後,還是會有3成機會在某一行出錯 如果程式很久才跑一次就正常,密集重複執行就比較可能會出錯。 程式碼 http://pastebin.com/BRZNwk0Q 只要出錯就是固定在 while 的第2行, realloc 那邊 錯誤訊息: free(): invalid next size (normal): 0x000000000076d7e0 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 125.227.205.43 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1475732835.A.AB4.html ※ 編輯: deo2000 (125.227.205.43), 10/06/2016 13:48:15

10/06 13:57, , 1F
10/06 13:57, 1F
感謝, 因為是純C,所以我把 bool true false 改 int 1 0 會有2成機會發生另一個錯誤 malloc(): memory corruption: 在第一個 puts("debug mark") 之前發生

10/06 13:59, , 2F
realloc的參數和回傳值可以嘗試不同變數。
10/06 13:59, 2F
※ 編輯: deo2000 (125.227.205.43), 10/06/2016 14:28:26 ※ 編輯: deo2000 (125.227.205.43), 10/06/2016 14:29:36

10/06 14:56, , 3F
其他地方沒有非法存取嗎..這heap被寫爆了
10/06 14:56, 3F
先暫時用比較笨的作法組合字串,求穩定先QQ 不然程式無法繼續寫下去 ※ 編輯: deo2000 (125.227.205.43), 10/06/2016 14:58:01

10/06 15:00, , 4F
我指的是 有可能其他地方寫壞 只是這裡剛好free才爆炸
10/06 15:00, 4F

10/06 21:39, , 5F
strncpy 在你給的大小到達時「不會」把結尾的'\0'寫進去
10/06 21:39, 5F

10/06 21:39, , 6F
不像 strncat 是會幫你加 '\0' 結尾的
10/06 21:39, 6F

10/06 21:40, , 7F
因此 strncpy 那行製造了一個沒有結束的字串, 問題應該在這
10/06 21:40, 7F

10/06 21:41, , 8F
如果你真的確定你計算的空間是足夠的, 那可以不需要 n 版
10/06 21:41, 8F

10/06 21:41, , 9F
直接用普通的 strcpy / strcat 即可
10/06 21:41, 9F

10/07 01:27, , 10F
如果是大約固定長度字串,沒必要用calloc來申請空間
10/07 01:27, 10F

10/07 01:28, , 11F
或者申請一次空間就好,不要一直calloc一直free
10/07 01:28, 11F

10/14 14:33, , 12F
有先確保realloc要到的空間有被清為0嗎? 如果有殘值,
10/14 14:33, 12F

10/14 14:34, , 13F
在操作strncpy & strncat時可能會有意料外的行為
10/14 14:34, 13F
文章代碼(AID): #1NzULZgq (C_and_CPP)
文章代碼(AID): #1NzULZgq (C_and_CPP)