下面的Psudo代码,但有没有人知道为什么这会破坏堆? urlencode函数是在其他地方下载的标准库函数,并且似乎按设计运行。在实际的代码中,我使用动态大小的char数组,因此在main中需要malloc的原因。
/* Returns a url-encoded version of str */
/* IMPORTANT: be sure to free() the returned string after use */
char *urlencode(char *str) {
//char *pstr = str, *buf = malloc(strlen(str) * 3 + 1), *pbuf = buf;
char *pstr = str, *buf = malloc(strlen(str) * 3 + 1), *pbuf = buf;
while (*pstr) {
if (isalnum(*pstr) || *pstr == '-' || *pstr == '_' || *pstr == '.' || *pstr == '~')
*pbuf++ = *pstr;
else if (*pstr == ' ')
*pbuf++ = '+';
else
*pbuf++ = '%', *pbuf++ = to_hex(*pstr >> 4), *pbuf++ = to_hex(*pstr & 15);
pstr++;
}
*pbuf = '\0';
return buf;
}
int testFunction(char *str) {
char *tmpstr;
tmpstr = urlencode(str);
// Now we do a bunch of stuff
// that doesn't use str
free(tmpstr);
return 0;
// At the end of the function,
// the debugger shows str equal
// to "This is a test"
}
int main() {
char *str = NULL;
str = malloc(100);
strcpy(str, "This is a test");
testFunction(str);
free(str); // Debugger shows correct value for str, but "free" breaks the heap
return 0;
}
感谢。
答案 0 :(得分:1)
我猜我str
已经释放了free(tmpstr);
- 请查看urlencode
- 函数的行为。看起来它不会生成一个新的字符串作为返回值,而是将(更改的)输入字符串传回。
答案 1 :(得分:0)
问题结果是str的初始malloc的大小计算问题被执行为0.感谢您的评论,遗憾的是没有办法真正标记答案作为评论。
如果这是一种不正确的方式来解决这个问题,请告诉我。