下面的代碼代碼,但沒有人知道爲什麼這會打破堆? urlencode函數是在其他地方下載的標準庫函數,並且可以按設計運行。在實際的代碼中,我使用動態大小的char數組,因此malloc需求的原因在main中。傳遞char函數打破堆
/* 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;
}
謝謝。
您是否收到段錯誤?或者是一個雙重的免費/堆腐敗錯誤具體? – PherricOxide
這裏沒問題,但如果你在ASCII範圍之外有'char','to_hex(* pstr >> 4)'可能會引起麻煩,用'0xF'掩蓋它也更安全。 –
適合我,Valgrind不會產生任何錯誤。你確定'//現在我們做了一堆不使用str的東西'的代碼不會損壞堆嗎?你有沒有試過在Valgrind下運行它? –