Код Psudo ниже, но есть ли у кого-нибудь идеи, почему это будет разбивать кучу? Функция urlencode является стандартной библиотечной функцией, загруженной в другое место, и, по-видимому, функционирует так, как она была разработана. В фактическом коде я использую массивы массивов динамического размера, поэтому причина для требования 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;
}
Спасибо.
Вы получаете segfault? Или, например, двойная ошибка с ошибкой/ошибкой кучи? – PherricOxide
Здесь нет проблем, но если у вас есть 'char' вне диапазона ASCII,' to_hex (* pstr >> 4) 'может вызвать проблемы, безопаснее маскировать это с помощью' 0xF'. –
Работает отлично для меня, и Valgrind не производит ошибок. Вы уверены, что код в '// Теперь мы делаем кучу вещей, которые не используют str', не повреждают кучу? Вы пытались запустить его под Valgrind? –