作者deo2000 (800IM)
看板C_and_CPP
标题[问题] 大约一半机率会记忆体错误的字串处理函式
时间Thu Oct 6 11:37:51 2016
这个 function 主要是将自己写的 Key&Value struct link list
串成一个 QueryString
大约一半机率会发生如下错误:
*** Error in
`/home/lky/workspace/*******************': free():
invalid next size (normal): 0x00000000021297e0 ***
想请版友帮忙诊断一下,是不是哪边记忆体处理有缺失?
//用来组合 QueryString 的 node
struct listKeyValuePair
{
char* strKey;
char* strValue;
//Link list
struct listKeyValuePair* perv;
struct listKeyValuePair* next;
};
//用来把 listKeyValuePair 已经串起的整个 Link List 转换成单一 QueryString
char* ConvertToQueryString(struct listKeyValuePair* node)
{
char* strQueryString = (char*)calloc(sizeof(char),0);
while(NULL != node)
{//一个接一个按照QueryString格式串上去
size_t newLength =
strlen(strQueryString)+strlen(node->strKey)+strlen(node->strValue)+3;
strQueryString = (char*)realloc(strQueryString, newLength);
if(NULL == node->perv)
{//第一个
sprintf(strQueryString, "%s=%s",node->strKey,
node->strValue);
}
else
{//第二个以後
sprintf(strQueryString, "%s&%s=%s", strQueryString,
node->strKey,
node->strValue);
}
node = node->next;
}
//puts(strQueryString);
return strQueryString;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 125.227.205.43
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1475725074.A.177.html
1F:→ stupid0319: 向calloc申请0个位置? 10/06 11:46
因为想要确保是'\0'结尾空字串,不然会是乱七八糟的内容
2F:→ stupid0319: 而且参数前後好像放错了,小弟乱猜的 10/06 11:48
※ 编辑: deo2000 (125.227.205.43), 10/06/2016 11:49:43
3F:→ stupid0319: 记忆体那麽便宜了,不用那麽节检吧XDXD 10/06 11:52
4F:推 steve1012: 用snprintf 10/06 12:02
谢谢,照改之後就不会记忆体错误了。但我现在还看不出原因?
但是改了以後QueryString就会无法串起,return 只会剩下最後那一对,也还在找原因
5F:推 steve1012: 看了一下所以你一直realloc吗 为何不算长度一次配完记 10/06 12:12
6F:→ steve1012: 忆体 10/06 12:12
因为想把他写得有弹性,看list多长字串就长到哪里
※ 编辑: deo2000 (125.227.205.43), 10/06/2016 12:29:30
7F:→ jacky1989: 13诫之6 10/06 12:30
free 掉就没有东西可以 return 了耶?
※ 编辑: deo2000 (125.227.205.43), 10/06/2016 12:33:01
※ 编辑: deo2000 (125.227.205.43), 10/06/2016 12:47:33
8F:→ stupid0319: calloc(1,0)回传值是什麽呢,没空间的空间,三次元吗 10/06 13:05
就"\0"
9F:→ stupid0319: 而且return字串的char*真的很少见的写法,有创意 10/06 13:11
10F:→ stupid0319: 正常应该是把字串空间先创好,在给进含数的参数运用 10/06 13:13
※ 编辑: deo2000 (125.227.205.43), 10/06/2016 13:26:24
11F:推 LPH66: 楼上好像讲到重点了: calloc 的参数是 (个数, 元素大小) 10/06 13:35
12F:→ LPH66: 并不是 (总长度, 内容值), 所以应该要写 calloc(1,1) 才对 10/06 13:36
13F:→ LPH66: calloc 一定会填 0 所以也不用自己写 0 10/06 13:36
14F:→ LPH66: 原 PO 你试试最一开始的写法但把 (1,0) 换成 (1,1) 看看 10/06 13:37
15F:→ LPH66: newLength 其实只要 +1 即可, 但 +3 其实也无妨就是 10/06 13:38
16F:→ LPH66: 咦不对, 我错了...你有中间连接的字串所以需要 +3 没错 10/06 13:38
17F:→ godspeedlee: 安安有没有试过valgrind? 10/19 04:11