2013-06-14 15 views
-1

Это мой код:Повреждение кучи, освобождая память C

int load_data(char *line, int *vertex, int *edge) 
{ 
    char *ch_number = NULL; 
    char *error = NULL; 

    *vertex = (int)strtol(line, &error ,10); 
    if((error[0] != '-') && (error[1] != '>')) return 0; 

    ch_number = (char*)malloc(sizeof(char) * (strlen(error) - 2)); 

    memcpy(ch_number, &error[2], strlen(error) - 2); 
    ch_number[strlen(error) - 2] ='\0'; 

    *edge = (int)strtol(ch_number, &error ,10); 

    if(error[0] != '\0') 
    { 
     free(ch_number); 
     return 0; 
    } 
    free(ch_number); 
    return 1; 
} 

Отладчик показывает, что свободный (ch_number); делает кучу коррупции. Что я делаю неправильно? Это пример использования:

load_data ("15643-> 45545546", & вершина, & край);

ответ

3

C массивы начинаются с нуля, так что линия

ch_number[strlen(error) - 2] ='\0'; 

пишет один байт за конец ch_number. Эффекты от этого не определены, но похоже, что вы написали на защитное слово, используемое менеджером кучи, чтобы точно определить такой тип коррупции.

Если вы хотите добавить нулевой терминатор ch_number, вам нужно выделить дополнительные байты памяти

ch_number = malloc(strlen(error) - 1);