作者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/cn.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