2012-10-09 2 views
0

Код 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; 
} 

Спасибо.

+1

Вы получаете segfault? Или, например, двойная ошибка с ошибкой/ошибкой кучи? – PherricOxide

+1

Здесь нет проблем, но если у вас есть 'char' вне диапазона ASCII,' to_hex (* pstr >> 4) 'может вызвать проблемы, безопаснее маскировать это с помощью' 0xF'. –

+2

Работает отлично для меня, и Valgrind не производит ошибок. Вы уверены, что код в '// Теперь мы делаем кучу вещей, которые не используют str', не повреждают кучу? Вы пытались запустить его под Valgrind? –

ответ

1

Я бы предположил, что str был уже освобожден free(tmpstr); - пожалуйста, взгляните на поведение функции urlencode. Похоже, что он не генерирует новую строку в качестве возвращаемого значения, а передает (измененную) строку ввода обратно.

+2

Нет, это не так, это 'malloc' 'buf' и возвращает это. –

0

проблема оказалась проблемой при вычислении размера для начального malloc str, выполняемого как 0. Спасибо за комментарии, к сожалению, нет способа по-настоящему отметить ответ в виде комментариев.

Если это неправильный способ закрыть это, пожалуйста, дайте мне знать.

+1

Думаю, вы можете удалить вопрос. В будущем вы отправляете свой реальный код или проверяете, что на самом деле код примера страдает от одной и той же проблемы (если это не так, разница может привести к решению). – ugoren

Смежные вопросы